不,这是底层 C 套接字(以及 TCP/IP 协议)的限制。我向您提出的问题是:当您可以构建应用程序来使用它们时,为什么要关闭它们?
许多短期套接字的问题在于,关闭它们会使它们处于一段时间内无法使用的状态(基本上是数据包生命周期的两倍,以确保网络中的任何数据包要么到达并被丢弃,要么被丢弃由网络本身)。基本上发生的情况是,在需要唯一的 4 元组(源 ip、源端口、目标 ip、目标端口)中,第一个和最后两个往往始终相同,因此,当您用完源时端口,你被淹没了。
我们之前在软件中遇到过这个问题,只有当我们在更快的机器上运行时,这个问题才变得明显(因为我们可以使用更多的会话)。
为什么不打开套接字并继续使用它呢?看起来您的协议是一个简单的请求/响应协议,使用这种方法应该可以轻松实现。
就像是:
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
for i in range(nb):
sck.send('question %i'%i)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
Update:
如果由于这种持续的打开/关闭而导致连接耗尽,一种可能性(我们之前已经这样做过)是检测问题并限制它。考虑以下代码(我添加的内容比 Python 更多的是伪代码,因为我已经有一段时间没有接触 Python 了):
for i in range(nb):
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((adr, prt)
while sck.error() == NO_SOCKETS_AVAIL:
sleep 250 milliseconds
sck.connect((adr, prt)
sck.send('question %i'%i)
sck.shutdown(SHUT_WR)
answer=sck.recv(4096)
print 'answer %i : %s' % (%i, answer)
sck.close()
基本上,它可以让您在资源充足的情况下全速运行,但当您遇到问题区域时,它会减慢速度。这实际上就是我们对产品所做的,以“解决”资源不足时失败的问题。我们本来会重新设计它,除非它是一个即将报废的遗留产品,而且我们基本上处于以最低成本修复服务模式。