1. ホーム
  2. python

[解決済み】I/Oエラー(ソケットエラー)が発生しました。) [Errno 111] 接続が拒否されました。

2022-02-21 09:51:43

質問

urllib を使って定期的に URL を取得するプログラムがありますが、断続的に のようなエラーが発生します。

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

編集 - グーグル検索はあまり役に立ちません。 私のコードにバグがないことを確認するにはどうしたらいいですか? というのは本当でしょうか?

解決方法は?

のようなパケットスニッファーを使用します。 ワイヤーシャーク を使用して、何が起こるか見てみましょう。SYNフラグのついたパケットの発信、SYN+ACKフラグのついた受信、そしてACKフラグのついた発信を確認する必要があるのです。その後、ローカル側でポートが開いているとみなされます。

最初のパケットしか見えず、数秒待ってもエラーメッセージが来る場合は、相手側が全く応答せず(例:ケーブルが抜かれている、サーバが過負荷、誤ったパケットが破棄された)、ローカルネットワークスタックが接続の試行を中止していることになります。RSTパケットが表示された場合、ホストは実際に接続を拒否しています。ICMP Port unreachable"またはhost unreachableパケットを見た場合、ファイアウォールまたはターゲットホストが、実際にポートが閉じられていることを知らせます。

もちろん、サービスが常に利用可能であることは期待できないので(あなたとデータの間にあるすべての障害点を考慮する)、後で再試行する必要があります。