web-dev-qa-db-ja.com

OSは、「アドレスがすでに使用されている」かどうかをどのように判断しますか?

私のCプログラムがソケットを使用し、localhost:9025にバインドし、一部のデータを交換し、手動で強制終了して再起動すると、次のエラーでクラッシュすることがあります。

アドレスはすでに使用されています。

私が「ポートを使用するpid」を検索しようとしたすべてのSE推奨ソフトウェアは、プロセスIDを返すことができなかったため、ポート9025を使用するプロセスがないと想定します。ケース。

それでも、トピックが似ている質問のコメントから集めたものから、プロセスがその特定のアドレスを使用する場合に限り、「アドレス」は「すでに使用されている」ように見えました。なぜこれが間違っているのですか?

OSが使用中のアドレスと未使用のアドレスを追跡していると思いますが、それは事実ですか?もしそうなら、どうすれば修正できるか教えてもらえれば幸いです。この問題に対する私の最善の解決策は「不確定な時間待つ」ことです。

編集:私はLinux 5.2.2-Arch1-1-Arch x86_64を使用しています

13
Captain Trojan

おそらくプログラムの再起動が速すぎるか、プログラムがソケットを閉じていません。

ソケットが閉じられた後でも、Linuxはしばらくの間接続を不安定に保ちますが、「ソースアドレス、ソースポート、宛先アドレス、宛先ポート」の同じ4つ組に対して他の接続が受け入れられないようにします。

解決策は、次のように setsockopt を使用してプログラムのソケットオプションを設定することです。

setsockopt(socket,SOL_SOCKET,SO_REUSEADDR ... )
32
harrymc