繁体   English   中英

I / O错误(套接字错误):[Errno 111]连接被拒绝

[英]I/O error(socket error): [Errno 111] Connection refused

我有一个程序,使用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

编辑 - 谷歌搜索不是很有帮助,我得到的是我从中获取的服务器有时拒绝连接,我如何验证它不是我的代码中的错误,这确实是这种情况?

使用像Wireshark这样的数据包嗅探器来查看会发生什么。 你需要看到一个带有SYN标记的数据包传出,一个带有SYN + ACK标记的传入,然后是一个带有ACK标记的传出。 之后,该港口被视为在本地开放。

如果您只看到第一个数据包并且在等待几秒钟之后出现错误消息,则另一方根本没有应答(例如:未插入的电缆,过载的服务器,错误的数据包被丢弃)并且您的本地网络堆栈中止连接尝试。 如果您看到RST数据包,则主机实际拒绝连接。 如果您看到“ICMP Port unreachable”或主机无法访问的数据包,则防火墙或目标主机会通知您实际关闭的端口。

当然,您不能指望服务始终可用(考虑您和数据之间的所有故障点),因此您应该稍后再试。

获得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")

用您喜欢的数字替换两个全部大写常量。

我以前在我的EC2实例中遇到了这个问题(我正在为couchdb提供服务资源 - 我考虑亚马逊的未来S3)。

要检查的一件事(假设是Ec2)是将couchdb端口添加到安全策略中的开放端口。

我特意遇到了

“[Errno 111]连接被拒绝”

当实例停止并启动时,超过EC2。 这个问题似乎是一个pidfile竞赛。 我的解决方案是通过以下方式杀死couchdb(完全正确):

pkill -f couchdb

然后重新启动:

/etc/init.d/couchdb restart

我不确定是什么导致了这一点。 您可以尝试查看您的socket.py(我的版本不同,因此跟踪中的行号不匹配,我担心其他一些细节也可能不匹配)。

无论如何,将url获取代码放在try: ... except: ... block中似乎是一种很好的做法,并通过短暂的暂停和重试来处理它。 您尝试获取的URL可能已关闭或加载过多,而且您只能通过重试来处理这些内容。

它似乎服务器运行不正常,所以确保使用终端

telnet ip port

telnet localhost 8069

它将返回连接到localhost,因此它表示连接没有问题,否则它将返回Connection拒绝它表示连接有问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM