【问题标题】:python recv from closed blocking socket来自封闭阻塞套接字的python recv
【发布时间】:2016-02-15 15:48:58
【问题描述】:

我正在尝试编写一个基于 tcp 套接字的服务器。在我阅读的 python 文档中,关闭套接字上的 recv 应该会引发错误。但是当客户端关闭套接字时,服务器仍然可以在此套接字上recv 并获得空字符串。那么我是否可以假设,如果recv 在阻塞套接字上返回空字符串,则表明此连接中断或已关闭?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    您必须检查是否收到了来自客户端的数据。如果 data 变量为空,您可以假设没有连接,因为客户端已关闭套接字或它们之间出现问题。很好的例子在https://docs.python.org/2/library/socket.html#example 或者如果你使用python3:https://docs.python.org/3.5/library/socket.html#example

    【讨论】:

      【解决方案2】:

      您必须通过代码处理 IOError 异常。

      except IOError as io_error:
          if io_error.errno == <YOUR CODE>:
              do something
      

      见:https://docs.python.org/2/library/errno.html#module-errno 获取代码

      【讨论】:

      • 但是当客户端程序崩溃或客户端意外关闭套接字时,没有任何警告它不会引发任何异常。 recv 然后在阻塞套接字上返回空字符串。
      • 展示您的案例。请简单的客户端和服务器。我不明白你的意思
      • 是的,我的应用程序中已经有了这个。问题是,如果我可以安全地假设,这将每次都有效。我以为recv在这种情况下会崩溃,所以我现在有点困惑。
      • 可以在try..except中处理异常IOError等。 IOError 的所有异常都可以忽略。
      猜你喜欢
      • 2023-03-03
      • 2011-09-13
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多