代码之家  ›  专栏  ›  技术社区  ›  Hongli

什么导致ENOTCONN错误?

  •  16
  • Hongli  · 技术社区  · 17 年前

    我目前正在维护一些web服务器软件,我需要执行很多I/O操作。这个 read() , write() , close() shutdown() 在套接字上使用调用时,有时可能会引发错误 ENOTCONN 错误这个错误到底意味着什么?触发它的条件是什么?我似乎永远无法在本地复制它,但有些用户可以。

    现在我只是忽略了 埃诺康 当被 关闭() 关机()

    编辑:

    • 我绝对相信 connect()
    • 埃诺康 通常是由 关闭() . 我很少见到一只猫 读() 写() 提高 埃诺康 .
    5 回复  |  直到 8 年前
        1
  •  22
  •   Dan Moulding    17 年前

    ENOTCONN connect 失败。该套接字很可能以前已连接,只是在调用时未连接导致 埃诺康 .

    这不同于:

    • ECONNRESET
    • ETIMEDOUT :这通常只适用于 连接 . 如果连接尝试在系统相关的时间内未成功,则可能发生这种情况。

    EPIPE 埃诺康 . 比如在一些系统上,, EPIPE 埃诺康 send .

    虽然这对我来说并不罕见 shutdown 归来 埃诺康 ,因为这个函数应该会破坏TCP连接,我会惊讶地看到 close 回来 埃诺康 . 它真的不应该这样做。

    最后,正如dwc所提到的, EBADF 不应在您的场景中应用,除非您正在尝试对已被删除的文件描述符执行某些操作 D断开套接字连接(即TCP连接已断开)与关闭与该套接字关联的文件描述符不同。

        2
  •  2
  •   Robert Siemer    13 年前

    认为对方刚刚关闭了连接是错误的。在TCP级别上,另一方只能半关闭连接(或中止连接)。如果两侧都关闭()(或关闭()),则连接通常完全关闭。如果双方都这么做,shutdown()实际上对双方都成功!

    问题是shutdown()没有 成功地普通(半)关闭连接,既不是第一个关闭连接,也不是第二个。从POSIX docs for shutdown()中列出的错误来看,ENOTCONN是最不合适的,因为其他错误表明传递给shutdown()的参数存在问题(或处理请求的本地资源问题)。

    发生了什么事?如今,双方之间的某个NAT设备可能已经放弃了关联,并作为一种反应发送重置数据包。重设连接在IPv4中非常常见,您可以在代码中的任何地方找到它们,甚至在shutdown()中伪装为ENOTCONN。

        3
  •  1
  •   talonmies    13 年前

    这是因为,在关闭()套接字时,套接字的缓冲区中有数据等待传递给已关闭()或关闭()其接收套接字的远程方。 我还没有完全理解套接字是如何工作的,我是一个noob,我甚至没有找到实现这个“关机”功能的文件,但是看到整个套接字几乎没有用户手册,我开始尝试所有的可能性,直到在“受控”环境中出错。可能是其他原因,但经过多次尝试后,我终于接受了以下解释:

    • 如果在远程端关闭连接后发送数据,则当您关闭()时,会出现错误。
    • 如果您没有发送任何数据,您可以随时关机,只要远程端不关机();一旦远程端有shutdown(),如果您尝试shutdown()而套接字已经shutdown(),则会出现错误。
        4
  •  0
  •   Lennart Koopmann    17 年前

    传输终结点未连接

    套接字与面向连接的协议关联,尚未连接。这通常是一个编程缺陷。

    发件人: http://www.wlug.org.nz/ENOTCONN

        5
  •  0
  •   dwc    17 年前

    如果你一开始就确定你连接正确, ENOTCONN fd 当你在请求的中间,或者当你处于请求的中间时,连接被关闭时,你的目标就结束了(也许在另一个线程中)。

    在任何情况下,这意味着插座未连接。去把那个插座清理干净。它死了。打电话没问题 close() shutdown() 在上面。

    推荐文章