Sch*_*tti 12 python sockets urllib
我有一个程序,使用urllib定期获取网址,我看到间歇性错误,如:
I/O错误(套接字错误):[Errno 111]连接被拒绝.
它有90%的时间可以正常工作,但是它失败了10%.如果在失败后立即重试获取,则成功.我无法弄清楚为什么会这样.我试图查看是否有可用的端口,它们是.任何调试想法?
有关其他信息,堆栈跟踪是:
File "/usr/lib/python2.6/urllib.py", line 203, in open
return getattr(self, name)(url)
File "/usr/lib/python2.6/urllib.py", line 342, in open_http
h.endheaders()
File "/usr/lib/python2.6/httplib.py", line 868, in endheaders
self._send_output()
File "/usr/lib/python2.6/httplib.py", line 740, in _send_output
self.send(msg)
File "/usr/lib/python2.6/httplib.py", line 699, in send
self.connect()
File "/usr/lib/python2.6/httplib.py", line 683, in connect
self.timeout)
File "/usr/lib/python2.6/socket.py", line 512, in create_connection
raise error, msg
Run Code Online (Sandbox Code Playgroud)
编辑 - 谷歌搜索不是很有帮助,我得到的是我从中获取的服务器有时拒绝连接,我如何验证它不是我的代码中的错误,这确实是这种情况?
Pau*_*aul 37
使用像Wireshark这样的数据包嗅探器来查看会发生什么.你需要看到一个带有SYN标记的数据包传出,一个带有SYN + ACK标记的传入,然后是一个带有ACK标记的传出.之后,该港口被视为在本地开放.
如果您只看到第一个数据包并且在等待几秒钟之后出现错误消息,则另一方根本没有应答(例如:未插入的电缆,过载的服务器,错误的数据包被丢弃)并且您的本地网络堆栈中止连接尝试.如果您看到RST数据包,则主机实际拒绝连接.如果您看到"ICMP Port unreachable"或主机无法访问的数据包,则防火墙或目标主机会通知您实际关闭的端口.
当然,您不能指望服务始终可用(考虑您和数据之间的所有故障点),因此您应该稍后再试.
tzo*_*zot 11
获取ECONNREFUSED错误意味着你的内核在另一端拒绝了连接,所以如果它是一个错误,它可能在你的内核或另一端.你可以做的是以一种非常具体的方式捕获错误,并在一段时间后再试一次,因为这似乎有效:
# This is Python > 2.5 code
import errno, time
for attempt in range(MAXIMUM_NUMBER_OF_ATTEMPTS):
try:
# your urllib call here
except EnvironmentError as exc: # replace " as " with ", " for Python<2.6
if exc.errno == errno.ECONNREFUSED:
time.sleep(A_COUPLE_OF_SECONDS)
else:
raise # re-raise otherwise
else: # we tried, and we had no failure, so
break
else: # we never broke out of the for loop
raise RuntimeError("maximum number of unsuccessful attempts reached")
Run Code Online (Sandbox Code Playgroud)
用您喜欢的数字替换两个全部大写常量.