send函数 获得已发送数据长度_TCP传输过程中,客户端异常退出导致服务端send函数崩溃...

9ebfcf262a1813ce5b196f89316eeca4.png

在linux下编写TCP socket程序时,如果客户端突然退出,导致连接中断,这个时候服务端如果继续调用send函数发送数据的话,会导致整个进程退出,这是我们不愿看到的。(注:如果是服务端突然退出,客户端继续调用send发送,是不会导致进程退出的)。

为什么会退出进程而不是返回一个错误值呢?感觉有点“霸道”,连留给我们处理问题的机会都没有。

原来,当服务端尝试使用一个disconnected socket进行send数据时,会让低层抛出一个SIGPIPE信号,这个信号的缺省处理方法是退出进程!

知道了问题原因后,处理就容易多了,比较简单的方法有以下2种:

重新定义一个信号处理函数,覆盖系统默认处理方法

void signal_process(){ //process code}signa(SIGPIPE, signa_process);

这样,进程就不会退出了。

修改send函数最后一个参数

linux下send函数原型为:

ssize_t send(int fd, const void*buf, size_t n, int flags);

其中,flags被忽略了,一般设置为0,但当flags为0时,如果客户端断开,服务端继续send时,会引发一个信号SIGPIPE,此信号会引发进程退出。

所以只需要把flags设置为MSG_NOSIGNAL,则不会导致信号退出。MSG_NOSIGNAL的含义是,当对方断开连接导致错误时,不发送SIGPIPE信号,但还是会返回EPIPE错误

这样,进程不退出,我们只需要判断send的返回值是否小于或等于0,就知道send函数是否调用成功!

35eeac512f172cc36ac8e50b685d7411.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值