相关文章推荐
睿智的甜瓜  ·  报错:curl: (56) Recv ...·  2 周前    · 
小胡子的日光灯  ·  recvfrom error ...·  5 天前    · 
宽容的佛珠  ·  js读取.xlsx Excel ...·  7 月前    · 
粗眉毛的树叶  ·  pnpm安装与使用 - 简书·  8 月前    · 
另类的蚂蚁  ·  CAPL: On Message Not ...·  1 年前    · 
小眼睛的红豆  ·  nginx docker 403 ...·  1 年前    · 

转载from: https://blog.csdn.net/lsjseu/article/details/43851429

EAGAIN、EWOULDBLOCK、EINTR与非阻塞 长连接

EWOULDBLOCK用于非阻塞模式,不需要重新读或者写

EINTR指操作被中断唤醒,需要重新读/写

在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。
从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如,以 O_NONBLOCK的标志打开文件/socket/FIFO,如果你连续做read操作而没有数据可读。此时程序不会阻塞起来等待数据准备就绪返 回,read函数会返回一个错误EAGAIN,提示你的应用程序现在没有数据可读请稍后再试。
又例如,当一个系统调用(比如fork)因为没有足够的资源(比如虚拟内存)而执行失败,返回EAGAIN提示其再调用一次(也许下次就能成功)。
Linux - 非阻塞socket编程处理EAGAIN错误
在linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno代码为11(EAGAIN),这是什么意思?
这表明你在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就可以。 对非阻塞socket而言,EAGAIN不是一种错误。在VxWorks和Windows上,EAGAIN的名字叫做EWOULDBLOCK。
另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。

最后,如果recv的返回值为0,那表明连接已经断开,我们的接收操作也应该结束。

另外附一下几个问题:

1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况 下认为连接是正常的,继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取



2、阻塞模式与非阻塞模式下write的返回值各代表什么意思? 有没有区别?

阻塞与非阻塞write返回值没有区分,都是 <0:出错,=0:连接关闭,>0发送数据大小,特别:返回值 <0时并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的, 继续发送。只是阻塞模式下write会阻塞着发送数据,非阻塞模式下如果暂时无法发送数据会返回,不会阻塞着 write,因此需要循环发送



3、阻塞模式下read返回 值 < 0 && errno != EINTR && errno != EWOULDBLOCK & amp;& errno != EAGAIN时,连接异常,需要关闭,read返回值 < 0 && amp; (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)时表示没有数据, 需要继续接收,如果返回值大于0表示接送到数据。

非阻塞模式下read返回值 < 0表示没有数据,= 0表示 连接断开,> 0表示接收到数据。

这2种模式下的返回值是不是这么理解,有没有跟详细的理解或跟准确的 说明?


4、阻塞模式与非阻塞模式下是否send返回 值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) 表示暂时发送失败,需要重试,如果send返回值 <= 0, && errno != EINTR && amp; errno != EWOULDBLOCK && errno != EAGAIN时,连接异常,需要关闭,如果send返回 值 > 0则表示发送了数据?send的返回值是否这么理解,阻塞模式与非阻塞模式下send返回值=0是否都是发送失败,还是那个模式下表示暂时 不可发送,需要 重发?

原文链接: https://blog.csdn.net/lsjseu/article/details/43851429 使用前记得连上学校wifi 关闭屏幕后断网了,去系统设置里给APP开锁屏清理白名单;默认在登陆后有通知栏提示,如果没有,也是系统设置没交保护费,自行设置去,通知栏的存在是为了,且方便用户看。 广财版去掉了 keep40_extra 包的发送,不影响使用,其他学校看着办,一般也不用。 已知 Bug 偶发性异常 recvfrom failed: EAGAIN (Try again) 可能为UDP丢包,目前解决方案是重发数据包。 偶发性异常 sendto: Operation not Permitted google说是Linux(android也是linu E INT R:指操作被中断唤醒,需要重新读/写   在Linux环境下开发经常会碰到很多错误(设置errno),其中 EAGAIN 是其中比较常见的一个错误(比如用在 非阻塞 操作中)。 从字面上来看,是提示再试一次。这个错误经常出现在当应用程序进行一些 非阻塞 (non- block ing)操作(对文件或socket)的时候。 1.实验目的 通过编写共享内存实验,进一步了解使用共享内存的具体步骤,同时加深对共享内存的理解。在本实验中,采用信号量作为同步机制完善两个进程(“生产者”和“消费者”)之间的通信,其功能类似于4.6节中... 1、recv函数: 返回值<0时并且(errno==E INT R||errno== EWOULD BLOCK ||errno== EAGAIN )的情况下认为连接是正常的,继续接收。 当socket设置为 非阻塞 的时候,recv返回错误时才会有errno== EWOULD BLOCK ||errno== EAGAIN 两种情况; #define EWOULD BLOCK EAGAIN ...... 在上一篇文章 《socket编程——一个简单的例子》 http://blog.csdn.net/wind19/archive/2011/01/21/6156339.aspx 中写了一个简单的tcp socket通信程序,可以进行数据的交互,但有一个问题是这个程序是阻塞的,任何socket函数都要等返回后才能进行下一步动作,如果recv一直没有数据,那么就一直不会返回,整个进程就阻塞在那。所以我们要进行改造一下,让程序不再阻塞在那,而是在有数据到来的时候读一下数据,有数据要写的时候发送一下数据。 linux下开发经常遇到一些错误,errno 在进行 非阻塞 IO编程时,调用read/recv,经常会返回 EAGAIN (11)这个错误。 由于read/recv立即返回,但是此时并没有数据可读,就会返回这个错误。 如果使用fork创建进程,如果资源不足,也会返回 EAGAIN 。 使用man命令在linux,得到如下解释。 EAGAIN Resource temporaril 转自: http://hi.baidu.com/newnlcloud/blog/item/c251b835c88dbf315bb5f5fa.html2009年11月19日 星期四 17:16  在Linux中使用 非阻塞 的socket的情形下。(一)发送时当客户通过Socket提供的send函数发送大的数据包时,就可能返回一个EGGAIN的错误。该错误产生的原因是由于send函数中的size变量大小超过了tcp_sendspace的值。tcp_sendspace定义了应用在调用send之前能够在kernel中 #define E INT R 4 /* Inte rrupted system call */ #define EWOULD BLOCK EAGAIN /* Operation would block */ EWOULD BLOCK 用于 非阻塞 模式,不需要重新读或者写 E INT R指被中断唤醒,需要重新读/写 原文:https://blog.csdn.net/majianfei1023/article/details/45337085 防止丢失,仅以备份,原文有格式。Linux后台开发应该具备技能(持续更新中)一、linux和os:1、linux下io,cpu,memory相关指令需要熟练使用(free ps netstat tcpdump iostat lsof) memory:top, f... 一、fork入门知识      一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一、 非阻塞 socket 非阻塞 套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步 非阻塞 套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步 非阻塞 模式的。 int 32_t flags = fcntl