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 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发