【问题标题】:Read timeout in gevent.socket在 gevent.socket 中读取超时
【发布时间】:2014-01-30 15:03:35
【问题描述】:

我可以使用 gevent.socket.create_connection 打开连接

self.socket = socket.create_connection(self.address,timeout=timeout)
...
payload = ""
while len(payload) < length:
    b = self.socket.recv(length - len(payload))
    payload += b
...
print payload

但是一段时间后recv 失败并引发socket.timeout 异常。

知道什么可能导致这样的异常吗?并且会简单地循环直到 recv 返回一个字符串工作,即,这仍然允许检测定期断开连接吗?

【问题讨论】:

    标签: sockets timeout gevent


    【解决方案1】:

    我只能假设已达到超时并且它引发了一个超时异常,我觉得这很奇怪,因为我无法重现它,如果我创建一个套接字并让它超时,连接就会关闭。这是来自文档的引用gevent.socket.create_connection:

    传递可选的超时参数将设置超时 尝试连接之前的套接字实例。如果未提供超时,则使用 getdefaulttimeout() 返回的全局默认超时设置。

    getdefaulttimeout() 默认为None,这意味着套接字不会超时。

    你应该一直循环直到你收到所有数据直到socket.recv()返回一个空字符串。这表明连接已关闭(无论出于何种原因)。这也适用于 gevent 套接字。

    我引用socket howto

    当一个recv返回0字节时,表示对方已经关闭(或正在关闭)连接。您将不会在此连接上收到更多数据。永远。

    你的循环应该像这样处理空字符串的情况:

    self.socket = gevent.socket.create_connection(self.address) # if timeout is necessary, make sure you add a high enough value.
    
    payload = ""
    while len(payload) < length:
        b = self.socket.recv(length - len(payload))
        if not b:
            break # or return, or raise an exception.
        payload += b
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 2020-01-19
      • 2014-02-21
      • 2014-08-06
      • 2019-08-20
      • 2014-06-06
      • 2011-01-29
      相关资源
      最近更新 更多