tcp send() 引发进程退出的原因

最近写一个tcp client,client在访问server一段时间后进程退出,也没有产生core文件,根据日志追踪,发现在执行tcp的send 时进程退出了。我当时想到的是,这应该是tcp自发引起的退出,那很可能是收到中断信号后的处理。在网上查过之后,同时也解决了这个问题,现总结一下。

解决问题的网上资料来源是http://hi.baidu.com/diday_xing/item/72229a273f565adca517b6fb

原因来自于我的client,使用了多线程的框架,然后把socket设为非阻塞。另外没有在send之前先select一下判断scoket是否可读,此时发生一种情况是,由于网络阻塞或者接收数据缓冲区大小不够的原因,接收方没有完全地接收到发送方发送的数据,发送方的发送数据没有清除的话,会继续发送数据给接收方,接收方链接依然在recv的话,接收方本来在收到前面不完整数据时就应该启动FIN_WAIT1半关闭状态,但是因为发送方依然发送数据,接收方仍然可以收到数据,之后启动半关闭状态,将这个socket设为关闭状态。并且发送一个RST标志通知到发送方。这时发送方可以通过select socket得到的可读,recv返回0,这个时候是不应该再调用send写操作,而是应该关闭socket,发送ack告知接收端完成半关闭状态,重新connect.如果没有判断select为可读以及处理recv为0, 这时候就发生了我的情况,收到SIGPIPE信号,这个信号的默认操作是自动退出进程。

解决的方法是忽略这个信号,另,综合服务的要求,没有必要设置socket为非阻塞。



你可能感兴趣的:(tcp send() 引发进程退出的原因)