linux中send函数MSG_NOSIGNAL
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相关推荐
- linux中send函数MSG_NOSIGNAL异常消息
最近2周在做 ineedle 的国舜项目扩展,需要使用 socket 的 tcp 连接向对方发送消息,当然需求很简单,只是按照对方要求发送指定格式的消息,程序结构也非常的简单,一对多的 client/ ...
- linux内核sock_sendmsg,为什么linux中sendto函数中的msg.msg_iovlen=1;
为什么linux中sendto函数中的msg.msg_iovlen=1; | 内核中定义的sys_sendto的源码吗? 这个属于sendmsg中struct msghdr的用法问题, sys_sen ...
- Linux中pthread_create函数的实现
转:http://blog.sina.com.cn/s/blog_6abf2c040101fpca.html 原文地址:[原]Linux中pthread_create函数的实现作者:jiq408694 ...
- linux中probe函数传递参数的寻找(下)
点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...
- linux中 probe函数的何时调用的?
点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...
- 每天学一点儿shell:linux中时间函数的date的用法
文章目录 1.linux中date函数格式 2.date日期函数的具体用法 2.1.获取相应格式的日期 2.2.获取相隔时间段的日期 2.2.1.获取今天的日期 2.2.2.获取昨天的日期 2.2.3 ...
- linux中request_region()函数的分析
linux中request_region()函数的分析 struct resource ioport_resource = { .name = "PCI IO", .start = ...
- Linux中popen函数的作用小结
概述 popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程.这篇文章重点给大家介绍Linux中popen函数的作用,感兴趣的朋友一起看看吧 p ...
- Linux中fork()函数详解
Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...
最新文章
- MySQL使用正则表达式
- ip sensor芯片级解决方案
- MS-SQLSERVER--错用了LEN()函数
- 84-java版spark2.x读取es6.x
- 计算机组成原理实验存储器部件实验,计算机组成原理实验_存储器部件教学实验...
- 微信H5页面嵌入百度地图---解决手机的webKit定位,ios系统对非https网站不提供支持问题
- pku 1149 PIGS(最大流)
- 阿里架构师首次畅谈余额宝背后的故事
- C语言实现的简易FTP客户端
- 华为云计算IE面试笔记-Fusionsphere架构及组件介绍(服务器虚拟化解决方案)
- 微信小程序大赛介绍文档
- 在代码里面如何使用workman
- html和ui有什么区别,前端设计和ui设计的区别是什么
- Q4营收猛增仍亏损上亿,Z世代的宠儿Snap何时逼近盈利点?
- for循环下标越界java_java下标越界问题
- XStream的分析
- 广州市天河区2021-2022学年九年级第一学期期末考试英语试题
- 用友致远OA不能加签、插入附件的解决方法(A8-m企业集团版)
- 连载一 --- 来到无限互联的两个月!
- 使用Docker部署Hadoop