Python socket.Error:[Errno 98]Address already in useの原因と解決方法

1483 ワード

一、原因の浅い分析
今日はPythonとhtml 5 Websocketの例を書いていますが、再実行スクリプトの実行を終了すると、いつもアドレスが存在し、使用されていることを示します.socketプログラミングでは、クライアントを介してサーバ側にメッセージを送信し、接続を閉じた後、すぐにサーバ側プログラムを実行すると、このエラーが表示されます.
 
  
socket.error: [Errno 98] Address already in use

これは、TCP/IPで接続を終了した4回の握手で、最後のACK返信が発行された後、2 MSLの時間待ちがあり、MSLは1つのセグメントがネットワークの中で最大の生存時間を指し、この時間は一般的に30秒なので、基本的に60秒後に再接続することができます!
どうして2 MSLを待つのですか?最終的にACK応答が発行された後、送信者はACKが他方の端で正常に受信されたかどうかを確認することができず、他方の端でACK応答が受信されなければ、1 MSL後に再びFINフラグメントが送信されるからである.したがって、送信側が2 MSLを待つ時間、すなわちACK返信と相手がFINフラグメントを送信する時間であり、この時間内にFINフラグメントが再び受信されなければ、送信側は相手がACK返信を正常に受信したと仮定し、このとき正常に接続を閉じる!
二、解決方法
pythonでsocketバインドのアドレスが使用されている場合、エラーが発生することがよくあります.
linuxで:
 
  
            “ socket.error: [Errno 98] Address already in use”

Windowsで:
 
  
          “socket.error: [Errno 10048] ( / / ) ”

これは、socketがデフォルトでアドレス多重化をサポートしていないためであり、多重化するには表示設定が必要である場合、すなわち、バインド前にsetsockop関数tを呼び出してソケットワードにアドレス再利用を許可する:socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
例:
 
  
        self.recSocket = socket.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))