1

我正在使用urllib2代理发送数千个请求。我在执行时收到了许多以下错误:

urlopen error [Errno 99] Cannot assign requested address

我在这里读到这可能是由于套接字已经被绑定。是这样吗?对于如何解决这个问题,有任何的建议吗?

4

3 回答 3

4

这是我之前准备的类似问题的答案.... 更早... 重用套接字时出现 Socket in use 错误

错误是不同的,但根本问题可能是相同的:您正在消耗所有可用端口并试图在 TIME_WAIT 状态结束之前重用它们。

[编辑:回应评论]

如果它在您的应用程序的能力/规格范围内,一个明显的策略是控制连接速率以避免这种情况。

或者,您可以使用该httplib模块。httplib.HTTPConnection()让您指定一个source_address元组,您可以使用它指定建立连接的端口,例如,这将从 localhost:9999 连接到 localhost:1234:

import httplib
conn = httplib.HTTPConnection('localhost:1234', source_address=('localhost',9999))
conn.request('GET', '/index.html')

然后是管理源端口分配的问题,如我之前的回答中所述。如果您使用的是 Windows,则可以使用此方法绕过端口 1024-5000 的默认范围。

(当然)你可以建立多少个连接是有上限的,什么样的应用程序需要快速连续建立数千个连接是值得怀疑的。

于 2012-08-16T07:32:32.857 回答
2

正如mhawke建议的那样,这个问题TIME_WAIT似乎最有可能。针对您的情况的系统范围修复可以是调整内核参数,以便更频繁地清理此类连接。两种选择:

$ sysctl net.ipv4.tcp_tw_recycle=1

这将让内核重用处于TIME_WAIT状态的连接。这可能会导致 NAT 设置出现问题。另一个是:

$ sysctl net.ipv4.tcp_max_orphans=8192
$ sysctl net.ipv4.tcp_orphan_retries=1

这告诉内核最多保持8192不附加到任何用户进程的连接,并且在终止 TCP 连接之前只重试一次。

请注意,这些不是永久性更改。添加设置以/etc/sysctl.conf使其永久化。

http://code.google.com/p/lusca-cache/issues/detail?id=89#c4
http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.kernel.obscure.html

于 2014-02-20T14:45:39.323 回答
1

我有一个类似的问题,但是使用 python 的请求库使用 POST 命令!更糟糕的是,我在每个执行程序上使用多处理来发布到服务器。因此,在几秒钟内创建了数千个连接,每个连接需要几秒钟才能从 TIME_WAIT 更改状态并为下一组连接释放端口。

在互联网上所有可用的解决方案中,通过使用 request.Session() 等来禁用keep-alive,我发现这个答案是有效的,它使用 'Connection' : 'close' 配置作为标头参数. 不过,您可能需要将标题内容放在 post 命令之外的单独行中。

headers = {
        'Connection': 'close'
}
with requests.Session() as session:
response = session.post('https://xx.xxx.xxx.x/xxxxxx/x', headers=headers, files=files, verify=False)
results = response.json()
print results

只需尝试使用请求库即可。

于 2018-04-09T15:07:31.417 回答