1. ホーム
  2. Qt

socket.errorを解決する。[Errno 98] アドレスが既に使用されている問題

2022-02-15 07:31:37

I. 基本設定

pythonでソケットバインディングアドレスが使用中の場合、しばしば以下のようなエラーになります。

linuxでは

            と表示され、 " socket.error: [Errno 98] Address already in use"

Windowsの場合。

          と表示され、 "socket.error: [Errno 10048] 通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)は一度だけ許可されます"


これは、ソケットがデフォルトでアドレスの再利用をサポートしていないためで、再利用したい場合は設定を表示する必要があります。つまり、setsockop関数tを呼び出してソケットにアドレスの再利用を許可してからバインドします: ソケット。 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))  





次に、さらなる設定( 同時接続数が多い場合は設定が必要 )

上記は、プログラム内の再利用を設定することです、さらに、あまりにも多くの同時接続要求がある場合、つまり、短時間で接続要求の多くは、システムが自動的に占有ポートの時間がまだ到着していない解放し、接続要求がある(利用可能なポートが使い切られている)ので、またアドレスすでに使用中のエラー)、それはTIME_WAIT状態の接続の多くを生成します このケースでは、調整する必要があります このケースでは、LinuxのTCP/IPカーネルパラメータが速くTIME_WAIT接続を解放するための調整が必要である。

設定ファイルをviで開きます。

# vi /etc/sysctl.conf

そして、このファイルに、次の行を追加します(詳細と説明は記事を参照してください)。    TCPコネクションのTime-WAITを減らすためにLinuxカーネルパラメータを変更する。 は、その linux TCP 接続設定 ).

net.ipv4.tcp_syncookies = 1 # You don't need to add this line if it's in the configuration file
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 5

最後に、以下のコマンドを入力して、カーネル・パラメータを有効にします。

# /sbin/sysctl -p