【问题标题】:a socket fd has been called "shutdown", can I "reopen" it?套接字 fd 已被称为“关闭”,我可以“重新打开”它吗?
【发布时间】:2017-03-10 07:50:25
【问题描述】:

我们知道套接字 fd 可以通过“shutdown()”函数部分关闭。我的问题是,是否有一个 API 可以重新打开 read peer 或 write peer?

【问题讨论】:

    标签: linux sockets shutdown


    【解决方案1】:

    不,这是不可能的。按照标准关闭会向对等方发起 FIN 请求。因此,连接两端的通信将被关闭。此外,即使您如此操作,将本地 TCP 堆栈的 FSM 切换回允许/支持相应通信的状态,对等方也不会处理此问题。

    看这里:http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm

    【讨论】:

    • shutdown() 仅关闭连接的一侧,除非您同时指定两者。
    • 我喜欢提到 FIN。 +1。
    • 并非所有关机都会发送 FIN。只有 SD_WRITE 这样做。 @linuxfan
    • @EJP 对,只有 SHUT_WR 和 SHUT_RDWR 可以。有趣的一点是,在发送了一个 FIN 之后,有 两个 主机改变了状态(在它们的有限状态机中)。您在下面的答案是正确的,但这不仅仅是 API 的问题,应该更改整个 TCP 协议以允许这样做。
    【解决方案2】:

    一个socket fd被称为“关闭”,我可以“重新打开”它吗?

    它没有关闭。但是,它肯定会在一个方向或另一个方向或两个方向都关闭,并且没有 API 可以撤消它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-24
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多