本文中分析的都是非阻塞态的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函数返回值错误处理相关推荐

  1. println()函数输出int类型返回值错误的问题

    out.println(); 在用这个语句输出其他类返回大的int类型的数据的时候,注意输出错误. 例如: out.println(class1.方法()):  导致错误: our.println(c ...

  2. recv函数和send函数

    本文中分析的都是非阻塞态的socket错误代码,因为阻塞态也不会出现EWOULDBLOCK错误. 1.recv函数: 返回值<0时并且(errno == EINTR || errno == EW ...

  3. mysql_ping()函数的作用以及返回值的类型正确的是,[单选] mysql_ping()函数的作用以及返回值的类型正确的是:()...

    [单选] mysql_ping()函数的作用以及返回值的类型正确的是:() 更多相关问题 中华田园犬,雄性,2岁,昨晚外出未归,今晨发现患犬精神沉郁,呼吸急促,体温39℃,左胸侧壁中下部有创 1884 ...

  4. 汇编和c语言函数的参数,C函数与汇编函数之间参数及返回值传递方法

    AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存器的 ...

  5. python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce、map、filter)

    python函数+定义+调用+多返回值+匿名函数+lambda+高级函数(reduce.map.filter) Python 中函数的应用非常广泛,比如 input() .print().range( ...

  6. 关于 Linux fork()进程创建函数 的 执行方式 返回值 lockf锁和并发 控制创建顺序 的探索

    文章目录 BEGIN Demo 1 - 了解fork执行方式 code & result comprehension Demo 2 - fork的返回值研究 code & result ...

  7. python怎么调用函数的返回值类型,10、Python基础之函数的调用与返回值

    一.函数参数 1.1 不定长参数 当我们定义函数时,可能需要定义一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数. 我们可以在形参前面加上一个 * ,这样这个形参就可以获取所有的实参,它将 ...

  8. python函数入参和返回值

    以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html ...

  9. C语言精髓篇|函数的参数和返回值

    如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品:从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值. 函数的参数 在函数定义中出现的参数可以看做是一个占位符,它没有数据,只 ...

最新文章

  1. Django模型之数据库操作-查询
  2. 彩蛋还是陷阱?我所经历的期权往事
  3. NYOJ 回文字符串
  4. C++知识点37——拷贝构造函数
  5. org.apache.commons.lang.StringUtils
  6. oracle 嵌套游标慢,oracle 嵌套游标以及java,oracle的时间处理
  7. 华为鸿蒙5g售价,华为首款5G手机售价公布,余承东透露鸿蒙将用于连接家庭设备...
  8. 第五章 常用页面元素自动化操作(上)
  9. JAVA语言基础-反射、特性
  10. 小米oj 组长偏头痛(二分)
  11. Excel连接数据库
  12. 【JS】利用JS给删除按钮添加提示框
  13. java跳转页面_几种方式实现Javaweb页面跳转
  14. gaussdb200 实操
  15. VGG网络讲解——小白也能懂
  16. Fiddler的详细介绍
  17. 大学排行榜 : qs全球中国区大学排行榜
  18. 南京网预赛 11 BY bly
  19. 有没有大佬知道怎么把dcm格式核磁图像,进行3D分割
  20. 最新版 Office 三国杀,体验式寻找最强电子表格

热门文章

  1. ip冲突问题解决和复现过程
  2. python学习实验报告(第三周)
  3. RN:CodePush热更新
  4. “信创产业”是什么?2020“信创”脱颖而出
  5. 教你免费给自己QQ号码后面加上“靓”字的方法
  6. STL标准模板库中的vector、string、deque、stack、list、set和map的详细介绍——C++学习记录01
  7. 设备一路485如何供两台电脑使用_电脑没装打印机怎样共享打印
  8. 云就是网络,云计算呢
  9. 《Dokcer的使用》(三) 镜像仓库和镜像
  10. 字符串转换为数组的方法