博客原文http://blog.csdn.net/wangzhongzheneasy/article/details/10927087
现有客户端A和服务器端B,服务器端B接受A的TCP连接请求建立连接,客户端A持续向服务器端发送数据。服务器端终止与客户端A的连接。客户端在某次发送数据失败后程序异常退出。
当一个进程向某个已收到RST的套接字执行写操作时,内核向该进程发送一个SIGPIPE信号。该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿的被终止。
更具体的说就是在客户端收到服务器端的FIN结束符以后,当客户端再次向服务器端发送数据时,服务器端会返回一个RST消息,程序调用则会返回一个ECONNRESET错误,但这并不会导致程序异常退出。当下一次再尝试写入数据的时候,将会导致内核产生一个SIGPIPE信号,在没有对该信号进行捕获的情况下,SIGPIPE信号将采用默认行为,即终止进程,所以才会产生客户端诡异的终止掉。
知道了原因,解决问题就很容易了,只要捕获该信号或者将该信号的信号处理设置为SIG_IGN就可以啦。
阅读(1389) | 评论(0) | 转发(0) |