14


4

ソケットプログラムがクラッシュした後、アドレスにバインドできません

ソケットを閉じる前にプログラムがクラッシュした場合、次に実行すると、次のようなエラーが表示されます。

socket.error: [Errno 48] Address already in use

ポートを変更すると、問題が修正されます。

これを回避する方法はありますか?また、なぜこれが発生しますか(プログラムが終了したときに、ソケットをガベージコレクションして閉じてはいけませんか?

3 Answer


23


リスニングソケットで `.setsockopt(SOL_SOCKET、SO_REUSEADDR、1)`を使用します。

これらの用語を検索すると、これが必要な理由について多くの説明が得られます。 基本的に、最初のプログラムが終了した後、OSは以前の待機ソケットを「TIME_WAIT」時間シャットダウン状態のままにします。 `SO_REUSEADDR`は、同じリスニングポートを使用することを意味します。


3


ほとんどのOSは、プログラムが最初に適切に閉じなかった場合、ソケットを閉じるのに最大_2_分かかります。 私は、SEGFAULT(およびそれを処理していない)などのCプログラムでこれを何度も経験しています。

編集:


2


ポートが別のプロセスで使用されているため、このエラーが発生している他の人がエラーを取得している可能性があります。 そのため、ポートが他のプロセスで使用されているかどうかを確認し、プログラムを別のポートで実行するか、ブロックしているプロセスを強制終了します。