本文中分析的都是非阻塞态的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. 【数据库】适用于SQLite的SQL语句(二)
  2. jar打包混淆上传全自动日志
  3. 【effective c++读书笔记】【第7章】模板和泛型编程(3)
  4. [SPOJ375]QTREE - Query on a tree【树链剖分】
  5. python初学者用什么开发环境搭建_2019-04-11 python入门学习——配置机器及搭建开发环境...
  6. Django源代码阅读分析-2:持久层结构分析
  7. 马云:梭梭树就是企业家精神
  8. 深度学习中端到端的理解
  9. 【排序算法】堆排序——常规方法
  10. VUE 组件之间通信
  11. mysql中find_in_set()函数的使用(转载)
  12. php 浮点型能位运算,重读PHP手册笔记系列(二)
  13. 数学建模18年美赛题目中英文
  14. python qq群_用Python玩转QQ群论坛
  15. CF 1383/1384
  16. NOIP模拟题17.9.26
  17. 谷歌浏览器,查找CSS选择器
  18. ASCII 与 UNICODE 字符映射表
  19. Future、FutureTask、CompletableFuture简介
  20. SEO技巧:Meta标签详解

热门文章

  1. 驰骋工作流-流程发起-自动发起-定时启动-专题讲解
  2. 支付“清结算”体系的设计方法
  3. 如何获取k8s拓扑_K8S集群安装部署 之 网络拓扑图
  4. 使用Adaptec 1200A延用IDE硬盘
  5. 【数论初步学习】扩展欧几里得定理
  6. matlab 产生伪随机序列
  7. 河南经贸职业学院计算机工程学院,华北水利水电大学外国语学院
  8. 字符串转换为数组的方法
  9. 安科瑞零序电流互感器在小接地电流系统中的应用(安科瑞-卓宋兰)
  10. LabVIEW编程LabVIEW开发ZL-524 四路模拟量采集模块例程与相关资料