TCP 的状态(二) : TCP 常见错误码
目录
TCP 协议错综复杂, 很容易出现错误,错误码非常之多。这里探究一些在编程中比较常见的错误码。tcp 错误码 在不同的操作系统中的值不同。这里取用 Linux 与 Windows 两种,如 connection_refused 在windows 中的值为10054, 在 Linux 中为54 .
eof
:
2
: End of file
eof 标志着流的结束。当对端关闭连接(调用了 shutdown
或 close
) 后,处于 CLOSE_WAIT
状态。 本端会收到 FIN, ACK
。此时如果本端再试图 read
,则会读到 eof
connection_refused
61
: Connection refused10061
: No connection could be made because the target machine actively refused it . 由于目标计算机积极拒绝,无法连接
在客户端试图与服务端建立连接的时候发生。一般是服务端没有处于监听状态。 客户端发送发 SYN
, 但是收到了 RST, ACK
connection_reset
54
: Connection reset by peer10054
: An existing connection was forcibly closed by the remote host . 远程主机强迫关闭了一个现有的连接。
对端对处于连接状态的socket 进行了异常断开, 如进程中断等。此时如果本端进行读操作,可能会得到此错误。
connection_aborted
53
Software caused connection abort10053
: An established connection was aborted by the software in your host machine . 你的主机中的软件中止了一个已建立的连接。
对端关闭了连接(发送了 FIN),处于 FIN_WAIT2
状态,等待本端关闭(发送 FIN
)。但如果对端收到地其它数据,收可以会发出 RST
。 此时本端再对 socket 进行写操作,会得到此错误。一般是本端收到了 eof 但是没有及时关闭连接。
和 connection_reset
不同,它是读时产生,connection_aborted
是写时产生。
bad_descriptor
9
: Bad file descriptor10009
: The file handle supplied is not valid. 提供的文件句柄无效
对处于 closed
状态的 socket 进行读写操作时会出现此错误
not_connected
57
: Socket is not connected10057
: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied. 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字 时)没有提供地址,发送或接收数据的请求没有被接受。
当调用了 async_connect
后尚未连接成功时,对socket 进行写操作会出现此错误 。 客户端在进行 send 前一般需要判断 socket 的状态,或者使用 锁、互斥量等手段,在连接成功后通知客户端再进行操作。