recv函数和send函数返回值错误处理
本文中分析的都是非阻塞态的socket错误代码,因为阻塞态也不会出现EWOULDBLOCK错误。
1、recv函数:
返回值<0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。
当socket设置为非阻塞的时候,recv返回错误时才会有 errno == EWOULDBLOCK || errno == EAGAIN两种情况;
- #define EWOULDBLOCK EAGAIN
因为宏定义EWOULDBLOCK和 EAGAIN ,所以二者等价;
- EWOULDBLOCK,WOULD英文语法是表示过去将来式,表示本来应该。。。;
放在此处的意思是,本来应该阻塞,却没有阻塞。(也就是并没有发生阻塞,原因是设置了非阻塞态,也就说这个错误是在非阻塞态时才会有的)
EWOULDBLOCK的意思是如果你不把socket设成非阻塞(即阻塞)模式时,这个读操作将阻塞,也就是说数据还未准备好(但系统知道数据来了,所以select告诉你那个socket可读)。使用非阻塞模式做I/O操作的细心的人会检查errno是不是EAGAIN、EWOULDBLOCK、EINTR,如果是就应该重读,一般是用循环。如果你不是一定要用非阻塞就不要设成这样,这就是为什么系统的默认模式是阻塞。
int foo(SOCKET socket, char *buff, int length)
{int nleft, nread;nleft = length;while(nleft > 0){nread = recv(socket, buff, nleft,0); if(nread == 0)//对端socket调用close()关闭{printf("%s", strerror(errno));return -1;}if(nread < 0){if(errno == EINTR ||errno == EAGAIN ||errno == EWOULDBLOCK)continue;printf("%s", strerror(errno));return -1;}nleft -= nread;buff += nread;}return(length - nleft);
}
如示例,recv函数是不能通过返回值来判断读满了buff个数据的,因为recv返回0表示,对端socket正常关闭了。
所以,需要通过判断未读的字节数>0?来解决这个问题。
2、send函数
int foo(SOCKET socket, char *buff, int length)
{int nleft, nsend;nleft = length;while(nleft > 0){nsend = send(socket, buff, nleft,0); if(nsend == 0)//对端socket调用close()关闭{printf("%s", strerror(errno));return -1;}if(nsend < 0){if(errno == EINTR ||errno == EAGAIN ||errno == EWOULDBLOCK)continue;printf("%s", strerror(errno));return -1;}nleft -= nsend;buff += nsend;}return(length - nleft);
}
3、附录
recv函数返回值及errno值
send函数errno值
recv函数和send函数返回值错误处理相关推荐
- println()函数输出int类型返回值错误的问题
out.println(); 在用这个语句输出其他类返回大的int类型的数据的时候,注意输出错误. 例如: out.println(class1.方法()): 导致错误: our.println(c ...
- recv函数和send函数
本文中分析的都是非阻塞态的socket错误代码,因为阻塞态也不会出现EWOULDBLOCK错误. 1.recv函数: 返回值<0时并且(errno == EINTR || errno == EW ...
- mysql_ping()函数的作用以及返回值的类型正确的是,[单选] mysql_ping()函数的作用以及返回值的类型正确的是:()...
[单选] mysql_ping()函数的作用以及返回值的类型正确的是:() 更多相关问题 中华田园犬,雄性,2岁,昨晚外出未归,今晨发现患犬精神沉郁,呼吸急促,体温39℃,左胸侧壁中下部有创 1884 ...
- 汇编和c语言函数的参数,C函数与汇编函数之间参数及返回值传递方法
AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存器的 ...
- python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)
python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...
- 关于 Linux fork()进程创建函数 的 执行方式 返回值 lockf锁和并发 控制创建顺序 的探索
文章目录 BEGIN Demo 1 - 了解fork执行方式 code & result comprehension Demo 2 - fork的返回值研究 code & result ...
- python怎么调用函数的返回值类型,10、Python基础之函数的调用与返回值
一.函数参数 1.1 不定长参数 当我们定义函数时,可能需要定义一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数. 我们可以在形参前面加上一个 * ,这样这个形参就可以获取所有的实参,它将 ...
- python函数入参和返回值
以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html ...
- C语言精髓篇|函数的参数和返回值
如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品:从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值. 函数的参数 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只 ...
最新文章
- Django模型之数据库操作-查询
- 彩蛋还是陷阱?我所经历的期权往事
- NYOJ 回文字符串
- C++知识点37——拷贝构造函数
- org.apache.commons.lang.StringUtils
- oracle 嵌套游标慢,oracle 嵌套游标以及java,oracle的时间处理
- 华为鸿蒙5g售价,华为首款5G手机售价公布,余承东透露鸿蒙将用于连接家庭设备...
- 第五章 常用页面元素自动化操作(上)
- JAVA语言基础-反射、特性
- 小米oj 组长偏头痛(二分)
- Excel连接数据库
- 【JS】利用JS给删除按钮添加提示框
- java跳转页面_几种方式实现Javaweb页面跳转
- gaussdb200 实操
- VGG网络讲解——小白也能懂
- Fiddler的详细介绍
- 大学排行榜 : qs全球中国区大学排行榜
- 南京网预赛 11 BY bly
- 有没有大佬知道怎么把dcm格式核磁图像,进行3D分割
- 最新版 Office 三国杀,体验式寻找最强电子表格
热门文章
- ip冲突问题解决和复现过程
- python学习实验报告(第三周)
- RN:CodePush热更新
- “信创产业”是什么?2020“信创”脱颖而出
- 教你免费给自己QQ号码后面加上“靓”字的方法
- STL标准模板库中的vector、string、deque、stack、list、set和map的详细介绍——C++学习记录01
- 设备一路485如何供两台电脑使用_电脑没装打印机怎样共享打印
- 云就是网络,云计算呢
- 《Dokcer的使用》(三) 镜像仓库和镜像
- 字符串转换为数组的方法