我正在编写将在 Linux、OS X 和 Windows 上运行的代码。它从服务器下载大约 55,000 个文件的列表,然后逐步浏览文件列表,检查文件是否存在于本地。(使用 SHA 哈希验证和其他一些好东西。)如果文件不存在本地或哈希不匹配,它会下载它们。
服务器端是基于 80 端口的 Ubuntu 上的普通 Apache 2。
客户端在 Mac 和 Linux 上完美运行,但在下载多个文件后在 Windows(XP 和 Vista)上给我这个错误:
urllib2.URLError: <urlopen error <10048, 'Address already in use'>>
此链接:http ://bytes.com/topic/python/answers/530949-client-side-tcp-socket-receiving-address-already-use-upon-connect指向 TCP 端口耗尽,但“netstat -n " 从未向我显示超过六个处于“TIME_WAIT”状态的连接,即使在它出错之前也是如此。
代码(它下载的 55,000 个文件中的每一个都调用一次)是这样的:
request = urllib2.Request(file_remote_path)
opener = urllib2.build_opener()
datastream = opener.open(request)
outfileobj = open(temp_file_path, 'wb')
try:
while True:
chunk = datastream.read(CHUNK_SIZE)
if chunk == '':
break
else:
outfileobj.write(chunk)
finally:
outfileobj = outfileobj.close()
datastream.close()
更新:我通过 greping 日志发现它恰好进入下载例程 3998 次。我已经运行了多次,每次都在 3998 处失败。鉴于链接文章指出可用端口为 5000-1025=3975(有些可能已过期并被重用),它开始看起来更像链接文章描述的真正问题。但是,我仍然不确定如何解决这个问题。进行注册表编辑不是一种选择。