send函数引发线程退出

在linux下进行send函数通信时,客户端断开socket,偶尔会导致服务端线程退出,通过网上查找资料,并参考了http://blog.youkuaiyun.com/think_nothing/article/details/17006179

得出退出原因,总结如下:


在linux下send函数原型为:

#include <sys/types.h>

 #include <sys/socket.h>

 ssize_t send(int sockfd, const void *buf, size_t len, int flags);

其中“flags”被忽略了,一般设置为0,但当flags为0时,如果客户端断开,继续往里边写数据的话,会引发一个信号SIGPIPE,此信号会引发线程的退出。


所以,将“flags”设置为MSG_NOSIGNAL,则不会导致线程退出。

MSG_NOSIGNAL的含义,通过man send,说明如下:

 MSG_NOSIGNAL (since Linux 2.2)
              Requests not to send SIGPIPE on errors on stream oriented sockets when  the
              other end breaks the connection.  The EPIPE error is still returned.

意思是,当对方断开连接导致错误时,不发送SIGPIPE信号。但还是会返回EPIPE错误。

于是,只需要判断send是否成功就可以了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值