ソケットエラー: [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))