转载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