<p>不,这是底层C套接字(以及TCP/IP协议)的限制。我的问题是:当您可以设计应用程序来使用它们时,为什么要关闭它们?</p>
<p>许多短期套接字的问题是,关闭它们会使它们处于暂时无法使用的状态(基本上是数据包生存期的两倍,以确保网络中的任何数据包要么到达并被丢弃,要么被网络本身丢弃)。基本上,在需要唯一的4元组(源ip、源端口、目标ip、目标端口)中,前一个和后两个往往总是相同的,因此,当您用完源端口时,您就被hose占用了。</p>
<p>我们以前在软件中遇到过这个问题,当我们运行在更快的机器上时(因为我们可以使用更多的会话),这个问题才变得明显。</p>
<p>为什么不打开插座继续使用呢?看起来您的协议是一个简单的请求/响应协议,使用这种方法应该很容易实现。</p>
<p>类似于:</p>
<pre><code>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()
</code></pre>
<p><em>更新:</em></p>
<p>一种可能(我们以前也这样做过)是,如果由于这种持续的打开/关闭而导致连接断开,则检测问题并限制它。考虑下面的代码(我添加的内容比Python更多是伪代码,因为我很久没有接触Python了):</p>
<pre><code>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()
</code></pre>
<p>基本上,它可以让你全速运行,同时有足够的资源,但当你打击你的问题领域时会减慢速度。这实际上是我们对我们的产品所做的“修复”当资源不足时失败的问题。我们本可以重新设计它,除非它是一个接近生命尽头的遗留产品,而且我们基本上是在以最低成本模式修复服务。</p>