首页 > Note > TCP 的状态(二) : TCP 常见错误码

TCP 的状态(二) : TCP 常见错误码

TCP 协议错综复杂, 很容易出现错误,错误码非常之多。这里探究一些在编程中比较常见的错误码。tcp 错误码 在不同的操作系统中的值不同。这里取用 Linux 与 Windows 两种,如 connection_refused 在windows  中的值为10054, 在 Linux 中为54 .

eof :

  • 2 : End of file

eof 标志着流的结束。当对端关闭连接(调用了 shutdownclose) 后,处于 CLOSE_WAIT 状态。 本端会收到 FIN, ACK 。此时如果本端再试图 read ,则会读到 eof

connection_refused

  • 61 : Connection refused
  • 10061 : No connection could be made because the target machine actively refused it . 由于目标计算机积极拒绝,无法连接

在客户端试图与服务端建立连接的时候发生。一般是服务端没有处于监听状态。 客户端发送发 SYN , 但是收到了 RST, ACK

connection_reset

  • 54 : Connection reset by peer
  • 10054 : An existing connection was forcibly closed by the remote host . 远程主机强迫关闭了一个现有的连接。

对端对处于连接状态的socket 进行了异常断开, 如进程中断等。此时如果本端进行读操作,可能会得到此错误。

connection_aborted

  • 53 Software caused connection abort
  • 10053 : 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 descriptor
  • 10009 : The file handle supplied is not valid. 提供的文件句柄无效

对处于 closed 状态的 socket 进行读写操作时会出现此错误

not_connected

  • 57 : Socket is not connected
  • 10057: 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 的状态,或者使用 锁、互斥量等手段,在连接成功后通知客户端再进行操作。

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.