EINTR:
阻塞的操做被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。
只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,若是出现EINTR即errno为4,错误描述Interrupted system call,操做也应该继续。若是recv的返回值为0,那代表链接已经断开,接收操做也应该结束。
ETIMEOUT:
一、操做超时。通常设置了发送接收超时,遇到网络繁忙的状况,就会遇到这种错误。
二、服务器作了读数据作了超时限制,读时发生了超时。
三、错误被描述为“connect time out”,即“链接超时”,这种状况通常发生在服务器主机崩溃。此时客户 TCP 将在必定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 得到一个 ACK 分节。当最终放弃尝试后(此时服务器未从新启动),内核将会向客户进程返回 ETIMEDOUT 错误。若是某个中间路由器断定该服务器主机已经不可达,则通常会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器从新启动后,因为 TCP 状态丢失,以前全部的链接信息也不存在了,此时对于客户端发来请求将回应 RST。若是客户进程对检测服务器主机是否崩溃颇有必要,要求即便客户进程不主动发送数据也能检测出来,那么须要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。
EAGAIN:
一、Send返回值小于要发送的数据数目,会返回EAGAIN和EINTR。
二、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不必定会触发EAGAIN,有可能返回0表示TCP链接已被关闭。
三、当socket是非阻塞时,如返回此错误,表示写缓冲队列已满,能够作延时后再重试.
四、在Linux进行非阻塞的socket接收数据时常常出现Resource temporarily unavailable,errno代码为11(EAGAIN),代表在非阻塞模式下调用了阻塞操做,在该操做没有完成就返回这个错误,这个错误不会破坏socket的同步,不用管它,下次循环接着recv就能够。对非阻塞socket而言,EAGAIN不是一种错误。
EWOULDBLOCK:EAGAIN (POSIX.1-2001 allows)
资源暂时不可用。这个错误是从对非阻塞socket进行的不能当即结束的操做返回的,如当没有数据在队列中能够读时,调用recv。并非fatal错误,稍后操做能够被重复。调用在一个非阻塞的SOCK_STREAM socket 上调用connect时会产生这个错误,由于有时链接创建必须消耗必定的时间。
EPIPE:
一、Socket 关闭,可是socket号并无置-1。继续在此socket上进行send和recv,就会返回这种错误。这个错误会引起SIGPIPE信号,系统会将产生此EPIPE错误的进程杀死。因此,通常在网络程序中,首先屏蔽此消息,以避免发生不及时设置socket进程被杀死的状况。
二、write(..) on a socket that has been closed at the other end will cause a SIGPIPE.
三、错误被描述为“broken pipe”,即“管道破裂”,这种状况通常发生在客户进程不理会(或未及时处理)Socket 错误,继续向服务 TCP 写入更多数据时,内核将向客户进程发送 SIGPIPE 信号,该信号默认会使进程终止(此时该前台进程未进行 core dump)。结合上边的 ECONNRESET 错误可知,向一个 FIN_WAIT2 状态的服务 TCP(已 ACK 响应 FIN 分节)写入数据不成问题,可是写一个已接收了 RST 的 Socket 则是一个错误。
ECONNREFUSED:
一、拒绝链接。通常发生在链接创建时。
拔服务器端网线测试,客户端设置keep alive时,recv较快返回0, 先收到ECONNREFUSED (Connection refused)错误码,其后都是ETIMEOUT。
二、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:
一、在客户端服务器程序中,客户端异常退出,并无回收关闭相关的资源,服务器端会先收到ECONNRESET错误,而后收到EPIPE错误。
二、链接被远程主机关闭。有如下几种缘由:远程主机中止服务,从新启动;当在执行某些操做时遇到失败,由于设置了“keep alive”选项,链接被关闭,通常与ENETRESET一块儿出现。
三、远程端执行了一个“hard”或者“abortive”的关闭。应用程序应该关闭socket,由于它再也不可用。当执行在一个UDP socket上时,这个错误代表前一个send操做返回一个ICMP“port unreachable”信息。
四、若是client关闭链接,server端的select并不出错(不返回-1,使用select对惟一一个socket进行non- blocking检测),可是写该socket就会出错,用的是send.错误号:ECONNRESET.读(recv)socket并无返回错误。
五、该错误被描述为“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”-“服务器过早终止”错误。
ECONNABORTED:
一、软件致使的链接取消。一个已经创建的链接被host方的软件取消,缘由多是数据传输超时或者是协议错误。
二、该错误被描述为“software caused connection abort”,即“软件引发的链接停止”。缘由在于当服务和客户进程在完成用于 TCP 链接的“三次握手”后,客户 TCP 却发送了一个 RST (复位)分节,在服务进程看来,就在该链接已由 TCP 排队,等着服务进程调用 accept 的时候 RST 却到达了。POSIX 规定此时的 errno 值必须 ECONNABORTED。源自 Berkeley 的实现彻底在内核中处理停止的链接,服务进程将永远不知道该停止的发生。服务器进程通常能够忽略该错误,直接再次调用accept。
当TCP协议接收到RST数据段,表示链接出现了某种错误,函数read将以错误返回,错误类型为ECONNERESET。而且之后全部在这个套接字上的读操做均返回错误。错误返回时返回值小于0。 服务器
(1) 若是客户机TCP协议没有接收到对它的SYN数据段的确认,函数以错误返回,错误类型为ETIMEOUT。一般TCP协议在发送SYN数据段失败以后,会屡次发送SYN数据段,在全部的发送都高中失败以后,函数以错误返回。
注:SYN(synchronize)位:请求链接。TCP用这种数据段向对方TCP协议请求创建链接。在这个数据段中,TCP协议将它选择的初始序列号通知对方,而且与对方协议协商最大数据段大小。SYN数据段的序列号为初始序列号,这个SYN数据段可以被确认。当协议接收到对这个数据段的确认以后,创建TCP链接。
(2) 若是远程TCP协议返回一个RST数据段,函数当即以错误返回,错误类型为ECONNREFUSED。当远程机器在SYN数据段指定的目的端口号处没有服务进程在等待链接时,远程机器的TCP协议将发送一个RST数据段,向客户机报告这个错误。客户机的TCP协议在接收到RST数据段后再也不继续发送SYN数据段,函数当即以错误返回。
注:RST(reset)位:表示请求重置链接。当TCP协议接收到一个不能处理的数据段时,向对方TCP协议发送这种数据段,表示这个数据段所标识的链接出现了某种错误,请求TCP协议将这个链接清除。有3种状况可能致使TCP协议发送RST数据段:(1)SYN数据段指定的目的端口处没有接收进程在等待;(2)TCP协议想放弃一个已经存在的链接;(3)TCP接收到一个数据段,可是这个数据段所标识的链接不存在。接收到RST数据段的TCP协议当即将这条链接非正常地断开,并向应用程序报告错误。
(3) 若是客户机的SYN数据段致使某个路由器产生“目的地不可到达”类型的ICMP消息,函数以错误返回,错误类型为EHOSTUNREACH或ENETUNREACH。一般TCP协议在接收到这个ICMP消息以后,记录这个消息,而后继续几回发送SYN数据段,在全部的发送都告失败以后,TCP协议检查这个ICMP消息,函数以错误返回。
注:ICMP:Internet 消息控制协议。Internet的运行主要是由Internet的路由器来控制,路由器完成IP数据包的发送和接收,若是发送数据包时发生错误,路由器使用 ICMP协议来报告这些错误。
调用函数connect的过程当中,当客户机TCP协议发送了SYN数据段的确认以后,TCP状态由CLOSED状态转为SYN_SENT状态,在接收到对 SYN数据段的确认以后,TCP状态转换成ESTABLISHED状态,函数成功返回。若是调用函数connect失败,应该用close关闭这个套接字描述符,不能再次使用这个套接字描述符来调用函数connect。
connect函数的出错处理:
(1)ETIMEOUT-connection timed out 目的主机不存在,没有返回任何相应,例如主机关闭
(2)ECONNREFUSED-connection refused(硬错)到达目的主机后,因为各类缘由创建不了链接,主机返回RST(复位)响应,例如主机监听进程未启用,tcp取消链接等
(3)EHOSTTUNREACH-no route to host(软错)路由上引起了一个目的地不可达的ICMP错误
其中(1)(3),客户端会进行定时屡次重试,必定次数后才返回错误。另外,当connect链接失败时,sockfd套接口不可用,必须关闭后从新socket分配才行。 网络