2024年3月11日发(作者:)
Linux网络编程socket错误分析
socket错误码:
EINTR: 4
阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。
只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如
果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。如果recv
的返回值为0,那表明连接已经断开,接收操作也应该结束。
ETIMEOUT:110
1、操作超时。一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。
2、服务器做了读数据做了超时限制,读时发生了超时。
3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩
溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获
得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返
回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应
“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误
是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,
之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST。如果客户进程对
检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么
需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。
EAGAIN:
1、Send返回值小于要发送的数据数目,会返回EAGAIN和EINTR。
2、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发
EAGAIN,有可能返回0表示TCP连接已被关闭。
3、当socket是非阻塞时,如返回此错误,表示写缓冲队列已满,可以做延时后再重试.
4、在Linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable,errno
代码为11(EAGAIN),表明在非阻塞模式下调用了阻塞操作,在该操作没有完成就返回这个
错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就可以。对非阻塞
socket而言,EAGAIN不是一种错误。
EPIPE:
1、Socket 关闭,但是socket号并没有置-1。继续在此socket上进行send和recv,就会返回
这种错误。这个错误会引发SIGPIPE信号,系统会将产生此EPIPE错误的进程杀死。所以,
一般在网络程序中,首先屏蔽此消息,以免发生不及时设置socket进程被杀死的情况。
2、write(..) on a socket that has been closed at the other end will cause a SIGPIPE.
3、错误被描述为“broken pipe”,即“管道破裂”,这种情况一般发生在客户进程不理会(或
未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送
SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边
的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN
分节)写入数据不成问题,但是写一个已接收了 RST 的 Socket 则是一个错误。
EBADF:
read(..) or write(..) on a locally closed socket will return EBADF
EFAULT:
地址错误。
EBUSY:
ECONNREFUSED:
1、拒绝连接。一般发生在连接建立时。
拔服务器端网线测试,客户端设置keep alive时,recv较快返回0, 先收到ECONNREFUSED
(Connection refused)错误码,其后都是ETIMEOUT。
2、an error returned from connect(), so it can only occur in a client (if a client is defined as the
party that initiates the connection
ECONNRESET:
1、在客户端服务器程序中,客户端异常退出,并没有回收关闭相关的资源,服务器端会先
收到ECONNRESET错误,然后收到EPIPE错误。
2、连接被远程主机关闭。有以下几种原因:远程主机停止服务,重新启动;当在执行某些操
作时遇到失败,因为设置了“keep alive”选项,连接被关闭,一般与ENETRESET一起出
现。
3、远程端执行了一个“hard”或者“abortive”的关闭。应用程序应该关闭socket,因为它
不再可用。当执行在一个UDP socket上时,这个错误表明前一个send操作返回一个ICMP
“port unreachable”信息。
4、如果client关闭连接,server端的select并不出错(不返回-1,使用select对唯一一个socket
进行non- blocking检测),但是写该socket就会出错,用的是send.错误号:ECONNRESET.读
(recv)socket并没有返回错误。
5、该错误被描述为“connection reset by peer”,即“对方复位连接”,这种情况一般发生在
服务进程较客户进程提前终止。当服务进程终止时会向客户 TCP 发送 FIN 分节,客户
TCP 回应 ACK,服务 TCP 将转入 FIN_WAIT2 状态。此时如果客户进程没有处理该 FIN
(如阻塞在其它调用上而没有关闭 Socket 时),则客户 TCP 将处于 CLOSE_WAIT 状态。
当客户进程再次向 FIN_WAIT2 状态的服务 TCP 发送数据时,则服务 TCP 将立刻响应
RST。一般来说,这种情况还可以会引发另外的应用程序异常,客户进程在发送完数据后,
往往会等待从网络IO接收数据,很典型的如 read 或 readline 调用,此时由于执行时序的
原因,如果该调用发生在 RST 分节收到前执行的话,那么结果是客户进程会得到一个非预
期的 EOF 错误。此时一般会输出“server terminated prematurely”-“服务器过早终止”错
误。
EINVAL:
无效参数。提供的参数非法。有时也会与socket的当前状态相关,如一个socket并没有进
入listening状态,此时调用accept,就会产生EINVAL错误。
EMFILE:


发布评论