linux 服务器 端一直检查是否有数据 发送给客户端。 如果有一直发(send) , 非阻塞的
linux 客户端 connect 服务 器端成功后 做如下循环接收 ,阻塞的
int rlen = -1;
while(1)
{
rlen = recv(); //阻塞
if(rlen < 0)
{
perror("recv");
break;
}
}
close(socket );
return;
运行一段时间后发现 客户端 recv 接收到104 信号
recv: Connection reset by peer
在服务器端send 也收到
send: Connection reset by peer
参考了如下(http://hi.baidu.com/tangzhenjian ... 75434879f05570.html )
假设Server A上面有Process X,它有一个socket M,和另外的Server B上面的Process Y的 Socket N以TCP协议连接上了,那么,据我所知,有2种情况会出现RST包:
(1)X没有close socket就退出了,然后Y继续向M send数据,A的内核就会发送RST 到 socket N;
(2)X设置了SO_LINGER,其中l_onoff 非0, l_linger 为0,这样当A close socket M的时候,也会发送RST到socket N。
当socket N收到了RST,select的结果为socket可读,则:
(a)如果这个时候调用recv,返回-1,errno为ECONNRESET,如果再次调用recv,返回-1,errno为EPIPE,同事产生EPIPE信号;
(b)如果这个时候调用send,返回-1,errno为EPIPE,同时会产生SIGPIPE信号。
我的问题是 既然我client 收到RST,很迷惑怎么产生的RST 我在服务器端只是调用了send ,而且在send出现异常的时候,在close(clientsockfd) 连接之前我都有
shutdown(clientsockfd,SH_WR); 防止产生RST
该问题调试了1天多,居然发现是因为IP冲突导致的, 罪过 罪过