C++ Linuxアプリケーションでは、socket()、bind()、およびlisten()を呼び出してサーバーソケットを作成しています。通常、アプリケーションが2回(同じサーバーポートで)起動された場合、2番目のプロセスでbind()は失敗し、EADDRINUSEエラーが発生します。しかし、今ではbind()が明らかに成功したが、それに続くlisten()コールがEADDRINUSEエラーをスローしたケースがあります...なぜbind()からではなくlisten()からEADDRINUSEを取得できますか?
これはおそらくまれな競合状態ですが、 2番目のbind()は成功するが、2番目のlisten()は成功しない場合があります。誰かがそのような事件についてもっと知っていますか?
これは32ビット版RHEL 5.3です。
ありがとう、それは説明のようです。明らかに、ルールは次のとおりです。 listen()はカーネル内のポートを実際に予約し、別のプロセスがlisten()を呼び出した場合はEADDRINUSEを送出します。 bind()はポートを予約しませんが、別のプロセスがポート上でlisten()を呼び出した場合はEADDRINUSEを送出します – oliver