2

私は奇妙な行動に直面しました。

マニュアルには、「2 つのソケットが同じポート番号にバインドされているが、明示的なインターフェイスが異なる場合、競合は発生しない」と記載されています。ステップ 3 で、次の場合にシステムが失敗するのはなぜですか? OSのバグですか?( Microsoft フォーラムへの私の投稿には回答がありません) これに関する回避策ありますか?

  • ステップ 1. プロセス A は 127.0.1.1:88 (デフォルト) をバインドします — OK
  • ステップ 2. プロセス B が 127.0.0.1:88 をバインドします (SO_REUSEADDR を使用) — OK
  • ステップ 3. プロセス C は 127.0.0.1:88 をバインドします (SO_REUSEADDR を使用) — 失敗します (10013 WSAEACCES)

注: tcp ポートは同じですが、インターフェースは異なり、明示的です (ステップ 1 と 2-3 の間)。ユーザーは同じです。

この問題は、Windows Vista (32 ビット)、Windows Server 2008 (32 ビット)、Window Server 2008 R2 (64 ビット) などで発生します。

Windows XP では問題ありません。ステップ 3 は成功します。

更新: 参考までに、同じ問題: XP との Windows 7 ソケット バインド動作の違い、再利用アドレス ソケット オプション (WSAEACCES 10013 エラー)

4

1 に答える 1

3

両方のソケットが使用されている場合、2 つのソケットを同じ明示的なインターフェイスとポートにバインドするとSO_REUSEADDR、成功することが保証されます。Microsoft のドキュメントにもそう書かれています。SO_REUSEADDRを呼び出す前に両方のソケットで有効にしていないか、bind()実際に両方のソケットを同じ明示的なインターフェイスとポートにバインドしていないかのいずれかです。

bind()WSAEACCESインターフェイス/ポートが既に使用されている場合は戻りません。代わりに返しますWSAEADDRINUSEWSAEACCESバインドする権限がないものにバインドしようとしたことを意味します。これは別の種類のエラー状態です。

于 2012-06-27T23:31:44.417 に答える