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为非阻塞。



转载于:https://my.oschina.net/yvette/blog/109458

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值