<p>该问题是由于在关闭客户机的套接字后进入的时间等待状态中挂起的套接字引起的。默认情况下,套接字在可重用之前将保持此状态4分钟。您的客户(可能有其他流程的帮助)在4分钟内将它们全部消耗掉。请参阅<a href="https://stackoverflow.com/questions/1339142/wcf-system-net-socketexception-only-one-usage-of-each-socket-address-protocol/1339240#1339240">this answer</a>以获得良好的解释和可能的非代码解决方案。</p>
<p>如果不显式绑定套接字地址,Windows将动态分配1024-5000(3977个端口)范围内的端口号。此Python代码演示了问题:</p>
<pre><code>import socket
sockets = []
while True:
s = socket.socket()
s.connect(('some_host', 80))
sockets.append(s.getsockname())
s.close()
print len(sockets)
sockets.sort()
print "Lowest port: ", sockets[0][1], " Highest port: ", sockets[-1][1]
# on Windows you should see something like this...
3960
Lowest port: 1025 Highest port: 5000
</code></pre>
<p>如果您尝试立即再次运行此命令,它将很快失败,因为所有动态端口都处于时间等待状态。</p>
<p>有几种方法可以解决这个问题:</p>
<ol>
<li><p>管理自己的端口分配和
使用<code>bind()</code>显式绑定
到特定端口的客户端套接字
你每增加一次
创建套接字。你还是会有
处理端口所在的情况
已经在使用,但你不会
仅限于动态端口。e、 g</p>
<pre><code>port = 5000
while True:
s = socket.socket()
s.bind(('your_host', port))
s.connect(('some_host', 80))
s.close()
port += 1
</code></pre></li>
<li><p>摆弄SOúLINGER插座
选择。我发现这个
有时在Windows中工作(尽管
不确定原因):
<code>s.setsockopt(socket.SOL_SOCKET,
socket.SO_LINGER, 1)</code></p></li>
<li><p>我不知道这是否有帮助
你的特殊申请,
但是,可以发送
通过
使用
<a href="http://docs.python.org/library/xmlrpclib.html#multicall-objects" rel="nofollow noreferrer">multicall</a>方法。基本上
这让你可以积累
几个请求然后发送
一下子。你不会得到任何
回复直到你真正发送
累积的请求,因此您可以
基本上可以把它看作批处理
处理-这是否符合
你的应用程序设计?</p></li>
</ol>