【问题标题】:Why doesn't the socket close on the other side of the socket? (close_wait)?为什么套接字不在套接字的另一侧关闭? (关闭等待)?
【发布时间】:2013-02-11 13:20:58
【问题描述】:

我对套接字有疑问。我正在我的电脑和手机之间创建一个套接字来发送消息。当我关闭服务器或客户端时,它会发送一个 FIN 数据包并保持 FIN_WAIT2 状态一分钟。但是,对方卡在了CLOSE_WAIT状态,显然无法关闭socket。我认为套接字应该立即关闭,所以也许我应该以某种方式在客户端中实现一个代码,当服务器想要关闭它时关闭它,反之亦然。我该怎么做?

【问题讨论】:

    标签: c# c++ c sockets


    【解决方案1】:

    您需要关闭套接字通道的两端。

    如果服务器关闭与客户端的连接,客户端需要关闭客户端上的连接,以便传输最后一个FIN 数据包(从客户端到服务器)。这将触发TCP state machine 中的最后一个状态转换。

    【讨论】:

    • 谢谢,但是我不知道如何实现代码来关闭客户端上的连接。当我关闭服务器时,它会自动关闭其一侧的套接字。我应该测试一些条件还是在客户端捕获一些异常并在出现问题时关闭套接字?这会是实现这个的方法吗?
    • @cracq 当套接字的远程端关闭时,本地端变为可读,随后的读取操作将以零长度读取返回。这意味着套接字已经从远程端很好地关闭了,你也应该关闭你的端。
    【解决方案2】:

    CLOSE_WAIT 表示对端已发送 FIN 并且 TCP 正在等待本地应用程序关闭套接字。请参阅 RFC 793。它不会自动发生。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 2014-09-05
      • 2011-05-08
      相关资源
      最近更新 更多