WinSock错误#10055

2024-04-19 21:33:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我用python构建了客户机-服务器体系结构,不幸的是,最初的设计是每个对服务器的请求都由一个TCP连接表示,我必须以大组(20000+个以上)发送请求,有时会出现套接字错误^{}。在

我已经知道如何用python处理它:

>>> errno.errorcode[10055]
'WSAENOBUFS'
>>> errno.WSAENOBUFS
10055

并构建一个能够处理该错误并重新连接的代码(当然,为了让服务器有足够的时间来做它必须做的事情,几乎没有时间延迟):

^{pr2}$

我的问题是:

  • 有没有什么“良好实践”的方法来做到这一点?在
  • e.errno == errno.WSAENOBUFS是多平台的吗?如果不是这样,如何使其多平台?在

注意:我只在Windows上测试过,我需要它也能在Linux上运行。


Tags: 方法代码服务器客户机windows体系结构错误时间
1条回答
网友
1楼 · 发布于 2024-04-19 21:33:36

您正在用传出数据和所有连接建立和终止数据包阻塞TCP堆栈。在

如果您必须坚持这种设计,则强制每个连接到的延迟,直到成功发送其数据。也就是说,默认情况下,套接字上的close()会立即返回,而进一步的传递尝试和连接断开将在“后台”发生。您可以看到,在一个紧密的循环中执行超过20000次的操作可以很容易地压倒操作系统网络堆栈。在

以下操作将强制您的套接字close()在尝试传递数据时挂起长达10秒:

import struct
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 10))

注意,这与Pythonsocket.sendall()不同,它只是将所有字节传递给内核。在

希望这有帮助。在

相关问题 更多 >