ホームページ  >  記事  >  バックエンド開発  >  Python ソケットエラー: [Errno 98] アドレスはすでに使用されています 原因と解決策

Python ソケットエラー: [Errno 98] アドレスはすでに使用されています 原因と解決策

WBOY
WBOYオリジナル
2016-06-16 08:42:291918ブラウズ

1. 理由の簡単な分析

今日、私は Python と html5 Websocket インスタンスを作成しています。スクリプトを終了して再実行するたびに、アドレスが既に存在し、使用されているというメッセージが表示されます。関連ドキュメントを調べた結果、ソケット プログラミングでは、メッセージがクライアント経由でサーバーに送信され、接続が閉じられたときに、サーバー側プログラムをすぐに実行すると、次のエラーが表示されることがわかりました。

コードをコピー コードは次のとおりです:

ソケットエラー: [Errno 98] アドレスはすでに使用されています

これは、接続を終了する TCP/IP の 4 ウェイ ハンドシェイクでは、最後の ACK 応答が送信されるときに待機する時間が 2MSL あるためです。この時間は、ネットワーク内のフラグメントの最大生存時間を指します。通常は 30 秒なので、基本的には 60 秒後に再接続できます。
なぜ 2MSL を待つ必要があるのでしょうか?これは、最終的に ACK 応答を送信した後、送信側は相手側で ACK が正常に受信されたかどうかを確認できないため、相手側が ACK 応答を受信しなかった場合、1MSL 後に再度 FIN フラグメントを送信することになります。したがって、送信者は 2MSL 時間待機します。これは、ACK 応答を送信し、相手が FIN フラグメントを送信するのにかかる時間です。この時間内に FIN フラグメントが再度受信されない場合、送信者は相手が受信したものとみなします。相手は正常に ACK 応答を受信しました。この時点で接続は正常に終了します。

2. 解決策

Python でソケットにバインドされたアドレスが使用されている場合、エラーが頻繁に発生します。

Linux の場合:

コードをコピー コードは次のとおりです:

「socket.error: [Errno 98] アドレスはすでに使用されています」
が表示されます
窓の下:
コードをコピー コードは次のとおりです:

"socket.error: [Errno 10048] 通常、各ソケット アドレス (プロトコル/ネットワーク アドレス/ポート) は 1 回だけ使用できます。"

これは、ソケットがデフォルトでアドレスの再利用をサポートしていないためです。再利用したい場合は、明示的に設定する必要があります。つまり、バインドする前に setsockop 関数を呼び出して、ソケットがアドレスの再利用を許可できるようにする必要があります。 SOL_SOCKET,socket.SO_REUSEADDR,1 )

例:

コードをコピー コードは次のとおりです:

self.recSocket =ソケット.socket(socket.AF_INET、socket.SOCK_DGRAM)
self.recSocket.settimeout(CHECK_TIMEOUT)
self.recSocket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.recSocket.bind(('', UDP_PORT))
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。