gevent.socket中的读取超时



我可以使用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

然而一段时间后CCD_ 1失败并引发CCD_。

你知道是什么导致了这样的例外吗?简单地循环直到recv返回字符串是否有效,也就是说,这是否仍然允许检测定期断开连接?

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

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

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

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

我引用插座如何:

当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

相关内容

  • 没有找到相关文章

最新更新