質問: communicate("192.168.0.10", 12345, 23456); if(ret) { break; } }; WSACleanup(); return 0; } ```
回答: TCP/IPではlocal address / local port / remote address / remote portの4つのパラメーターでコネクションを識別します。`SO_REUSEADDR`とは、local address / local portが重複していてもremote address / remote portが異なれば識別できることを前提に`bind()`での重複チェックをバイパスするオプションです。 ですので今回のように意図的に4パラメーターを一致させると`bind()`は成功し`connect()`で失敗します。このようなことがあるため一般的にはクライアント側はランダムなポート番号を使用します(具体的には`bind()`しません)。 > > `setsockopt()`の部分をコメントアウトして再度実行した場合でも同様に`connect()`の部分でエラーとなりますが、なぜ`bind()`でエラーにならないんでしょうか。 > > > 推測ですが、`bind()`の段階ではlocal addressは`INADDR_ANY`ですが`connect()`の際、適切なアドレスに選択・変更されるので、次の`bind()`の段階では使用中と判断されずに済んでいるのかもしれません。 > > `SO_LINGER`は試しましたか? > > > どうなんでしょう? クライアント側では成功するかもしれませんが、サーバー側でも4パラメーターが一致していることには変わらないので、接続に失敗する可能性が残るとは思います。 > > > ``` > // ここでエラーが発生。エラーコードはFFFFFFFF > > ``` > > なお、`connect()`ドキュメント.aspx)には戻り値は`0`か`SOCKET_ERROR`でありエラーコードは`WSAGetLastError()`で取得するように記載されています。