我用python构建了客户机-服务器体系结构,不幸的是,最初的设计是每个对服务器的请求都由一个TCP连接表示,我必须以大组(20000+个以上)发送请求,有时会出现套接字错误^{
我已经知道如何用python处理它:
>>> errno.errorcode[10055]
'WSAENOBUFS'
>>> errno.WSAENOBUFS
10055
并构建一个能够处理该错误并重新连接的代码(当然,为了让服务器有足够的时间来做它必须做的事情,几乎没有时间延迟):
^{pr2}$我的问题是:
e.errno == errno.WSAENOBUFS
是多平台的吗?如果不是这样,如何使其多平台?在注意:我只在Windows上测试过,我需要它也能在Linux上运行。
您正在用传出数据和所有连接建立和终止数据包阻塞TCP堆栈。在
如果您必须坚持这种设计,则强制每个连接到的延迟,直到成功发送其数据。也就是说,默认情况下,套接字上的
close()
会立即返回,而进一步的传递尝试和连接断开将在“后台”发生。您可以看到,在一个紧密的循环中执行超过20000次的操作可以很容易地压倒操作系统网络堆栈。在以下操作将强制您的套接字
close()
在尝试传递数据时挂起长达10秒:注意,这与Python
socket.sendall()
不同,它只是将所有字节传递给内核。在希望这有帮助。在
相关问题 更多 >
编程相关推荐