簡體   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