【问题标题】:Python socket.connect hangs sometimesPython socket.connect 有时会挂起
【发布时间】:2014-02-20 22:56:08
【问题描述】:

我正在学习在 python 中使用套接字,但发生了一些奇怪的事情。

我在 try 块中调用 socket.connect,通常它要么完成并且我有一个新的套接字连接,要么引发异常。然而,有时它只是挂起。

我不明白为什么有时它会返回(即使没有连接!)而有时它只是挂起。是什么让它挂了?

我正在使用阻塞套接字(非阻塞似乎不适用于连接...),所以我添加了超时,但我希望连接完成而不需要超时。

也许,当它没有挂起时,它会收到一个响应,告诉它请求的 ip/port 不可用,而当它挂起时,只是没有来自另一端的响应?

我在 OSX10.8 上使用 python2.7

【问题讨论】:

标签: python sockets network-programming


【解决方案1】:

connect() 挂起通常是因为您连接到防火墙后面的地址,而防火墙只是丢弃您的数据包而没有响应。它在 Linux 上持续尝试连接大约 2 分钟,然后超时并返回错误。

【讨论】:

  • 我有一种感觉。但我已经建立了一个简单的 p2p 客户端。在我尝试连接之前,我让我的朋友在他的机器上运行了它,所以他机器上的 python 应该已经打开了套接字进行监听。这还不足以绕过防火墙吗?还是必须手动完成?
  • @Ethan 有时您可能还需要配置防火墙。尝试在禁用防火墙的情况下执行代码,看看它是否有效。如果可行,则可能是防火墙问题,否则将是另一个问题。
  • @Ethan 您可以手动配置防火墙或使用UPnP 以编程方式转发端口(不知道如何使用 Python 执行此操作)。
【解决方案2】:

防火墙可能是这种意外响应背后的原因。与其假设远程防火墙接受连接,不如使用超时是最好的选择。由于建立连接是一个快速的过程,并且在网络内,它不会花费更长的时间。因此,请给出适当的超时时间,以便您可以判断主机已关闭或正在丢弃数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多