EINTR
当系统调用,例如阻塞收包时,如果收到了xx信号,使用了信号处理函数处理该信号,则处理完毕后可能会返回EINTR信号。accept,read,write,select,open等可以重新调用,而connect不行。
收包写法:
while ( (read(fd,buf,len) < 0) && errno == EINTR )
EPIPE,ECONNRESET
前置条件:A B两端。A close。
ECONNREST:B给A发消息,会收到RST包,提示Connection reset by peer。
EPIPE:B继续给A发消息,收到SIGPIPE信号,提示Broken pipe。
EAGAIN
发送缓冲区被填满,导致write\send无法再向缓冲区提交要发送的数据。因此就产生了Resource temporarily unavailable的错误,EAGAIN 的意思也很明显,就是要你再次尝试。接收缓冲区无数据,导致read/recv无数据读取也会造成EAGAIN。非阻塞IO需要忽略EAGAIN信号。
ETIME
Timer expired。表示超时。比如阻塞send,recv时,可能会发生。
ENOBUFS
一是发送队列满了,二是内核无法分配新的内存空间。
本文探讨了socket编程中常见的errno错误,包括EINTR(信号中断)、EPIPE和ECONNRESET(连接重置和管道破裂)、EAGAIN(资源暂时不可用)以及ETIME(超时)。在遇到这些错误时,EINTR通常需要重试,EPIPE和ECONNRESET指示连接问题,EAGAIN提示应重新尝试,而ETIME则表示操作超时。
889

被折叠的 条评论
为什么被折叠?



