linux下当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会向系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退出,这对于服务器提供稳定的服务将造成巨大的灾难。为此,send()函数的最后一个参数可以设MSG_NOSIGNAL,禁止send()函数向系统发送异常消息

//中间的select就是为了侦测断开后再次连接并二次send

int socket_send(async_socket_t* async_sock, uint8_t* buf, int len){uint8_t* ptr = buf;int left = len;int rc;while (left > 0) {
#ifdef __IOS__rc = send(async_sock->fd, ptr, left, 0);
#elserc = send(async_sock->fd, ptr, left, MSG_NOSIGNAL);
#endifif(rc>0){left -= rc;ptr += rc;}else if (rc<0) {if (errno == EAGAIN) {break;} else if (errno == EINTR) {continue;} else {printf("send step 1 failed\n");return -1;}}}if(left>0){printf("wait writeable");fd_set writeset;FD_ZERO(&writeset);int max_fd = async_sock->fd + 1;struct timeval timeout;while(!async_sock->bstop && left>0){      timeout.tv_sec = 0;timeout.tv_usec = 100*1000;FD_SET(async_sock->fd, &writeset);int ret = select(max_fd, NULL, &writeset, NULL, &timeout);if( ret == 0){//TIMEOUTcontinue;}else if( ret < 0){printf("select failed\n");if(errno == EINTR){continue;}return -1;}//writeable
#ifdef __IOS__rc = send(async_sock->fd, ptr, left, 0);
#elserc = send(async_sock->fd, ptr, left, MSG_NOSIGNAL);
#endifif(rc>0){left -= rc;ptr += rc;}else if (rc<0) {printf("send step 2 failed\n");return -1;}}}return len-left;
}

linux中send函数MSG_NOSIGNAL相关推荐

  1. linux中send函数MSG_NOSIGNAL异常消息

    最近2周在做 ineedle 的国舜项目扩展,需要使用 socket 的 tcp 连接向对方发送消息,当然需求很简单,只是按照对方要求发送指定格式的消息,程序结构也非常的简单,一对多的 client/ ...

  2. linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;

    为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...

  3. Linux中pthread_create函数的实现

    转:http://blog.sina.com.cn/s/blog_6abf2c040101fpca.html 原文地址:[原]Linux中pthread_create函数的实现作者:jiq408694 ...

  4. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  5. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  6. 每天学一点儿shell:linux中时间函数的date的用法

    文章目录 1.linux中date函数格式 2.date日期函数的具体用法 2.1.获取相应格式的日期 2.2.获取相隔时间段的日期 2.2.1.获取今天的日期 2.2.2.获取昨天的日期 2.2.3 ...

  7. linux中request_region()函数的分析

    linux中request_region()函数的分析 struct resource ioport_resource = { .name = "PCI IO", .start = ...

  8. Linux中popen函数的作用小结

    概述 popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这篇文章重点给大家介绍Linux中popen函数的作用,感兴趣的朋友一起看看吧 p ...

  9. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

最新文章

  1. MySQL使用正则表达式
  2. ip sensor芯片级解决方案
  3. MS-SQLSERVER--错用了LEN()函数
  4. 84-java版spark2.x读取es6.x
  5. 计算机组成原理实验存储器部件实验,计算机组成原理实验_存储器部件教学实验...
  6. 微信H5页面嵌入百度地图---解决手机的webKit定位,ios系统对非https网站不提供支持问题
  7. pku 1149 PIGS(最大流)
  8. 阿里架构师首次畅谈余额宝背后的故事
  9. C语言实现的简易FTP客户端
  10. 华为云计算IE面试笔记-Fusionsphere架构及组件介绍(服务器虚拟化解决方案)
  11. 微信小程序大赛介绍文档
  12. 在代码里面如何使用workman
  13. html和ui有什么区别,前端设计和ui设计的区别是什么
  14. Q4营收猛增仍亏损上亿,Z世代的宠儿Snap何时逼近盈利点?
  15. for循环下标越界java_java下标越界问题
  16. XStream的分析
  17. 广州市天河区2021-2022学年九年级第一学期期末考试英语试题
  18. 用友致远OA不能加签、插入附件的解决方法(A8-m企业集团版)
  19. 连载一 --- 来到无限互联的两个月!
  20. 使用Docker部署Hadoop

热门文章

  1. 科学计算机已知角度和边长怎样算斜长,计算公式
  2. linux dup作用,unix/linux中的dup()系统调用
  3. java geojson和数据库_GeoJson和TopoJson数据格式的对比
  4. P1347 排序(topo)
  5. HTTP(超文本传输协议)详细解析
  6. Opengl三视图的坐标变换
  7. android自定义大转盘,Android 自定义View 抽奖大转盘(1)
  8. border设置1px看起来很粗问题
  9. 初次跑CNN进行掌纹识别遇到的问题
  10. 迅雷下载原理和P2p技术