1

ポートをリッスンする小さな TCP サーバーがあります。デバッグ中は、プロセスを強制終了するためにサーバーを CTRL-C するのが一般的です。

Windows では、サービスをすばやく再起動でき、ソケットを再バインドできます。Linux では、bind() が成功するまで数分待たなければなりません

bind() が失敗すると、errno=98、使用中のアドレスが返されます。

実装の違いをよりよく理解したいと思います。Windows は確かに開発者にとってより友好的ですが、Linux が「間違ったこと」をしているとは思えません。

私の推測では、新しいソケットの作成を許可する前に、考えられるすべてのクライアントが古いソケットが壊れていることを検出するまで Linux が待機しているということです。これを行う唯一の方法は、タイムアウトするのを待つことです

Linux での開発中にこの動作を変更する方法はありますか? Windowsがこれを行う方法を複製したいと思っています

4

1 に答える 1

4

SO_REUSEADDRLinux のソケットでオプションを使用したい。関連するマンページはsocket(7). その使用例を次に示します。この質問は、何が起こるかを説明しています。

これがこの回答の複製です。

Linux ではSO_REUSEADDR、アクティブな接続が存在しない限り、アドレスにバインドできます。Windows では、これがデフォルトの動作です。Windows では、SO_REUSEADDR を使用すると、追加で複数のソケットを同じアドレスにバインドできます。詳細については、こちらこちらを参照してください。

于 2011-02-12T17:27:57.953 に答える