什么原因导致ENOTCONN错误?

Hon*_*gli 18 sockets

我目前正在维护一些Web服务器软件,我需要执行大量的I/O操作.的read(),write(),close()shutdown()电话,一个插座上使用时,有时可能会引发ENOTCONN错误.这个错误究竟是什么意思?触发它的条件是什么?我似乎永远不会在本地重现它,但有用户可以.

现在我只是忽略ENOTCONNclose(),shutdown()因为它似乎无害,但我不完全确定.

编辑:

  • 我绝对相信这个connect()电话成功了.我检查它的返回值.
  • ENOTCONN通常由close()和提出shutdown().我很少见到read()write()提高ENOTCONN.

Dan*_*ing 19

如果您确定TCP连接的任何一方都没有关闭连接,那么听起来像远程端正在关闭连接.

ENOTCONN正如其他人所指出的,只是意味着套接字没有连接.这并不一定意味着connect失败.套接字可能以前已经连接过,它只是在呼叫时产生的ENOTCONN.

这不同于:

  • ECONNRESET:连接的另一端发送了TCP重置数据包.如果另一端拒绝连接,或者不承认它已经连接,则会发生这种情况.
  • ETIMEDOUT:这通常只适用于connect.如果连接尝试在依赖于系统的时间内未成功,则会发生这种情况.

EPIPE有时可以通过一些与套接字相关的系统调用在与或多或少相同的条件下返回ENOTCONN.例如,在某些系统上,EPIPE并且ENOTCONN当返回是同义的send.

虽然shutdown返回并不罕见ENOTCONN,因为这个函数应该拆掉TCP连接,我会惊讶地看到close返回ENOTCONN.它真的不应该那样做.

最后,正如dwc所提到的,EBADF除非您在已经closed的文件描述符上尝试某些操作,否则不应该在您的场景中应用.套接字断开连接(即TCP连接已断开)与关闭与该套接字关联的文件描述符不同.