2

boost ライブラリを使用してサーバー アプリケーションを作成しています。一度に 1 つのクライアントが許可されるため、async_accept(...) 関数が呼び出されると、アクセプターは閉じられます。

私のサーバーの唯一の仕事は、定期的にデータを送信することです(サーバーで送信が有効になっている場合、そうでない場合は有効になるまで「そこに座ってください」)。したがって、ブースト メッセージ キューがあります。メッセージが到着すると、send() がソケットで呼び出されます。

私の問題は、クライアントがまだリッスンしているかどうかがわからないことです。通常は気にしませんが、次の送信までに送信でエラーが発生します。

しかし、私の場合、ソケットが開かれたときにアクセプターは開かれません。ソケットが CLOSE_WAIT 状態になった場合、クライアントが再び接続できるように、ソケットを閉じてアクセプターを再度開く必要があります。

送信が無効になっている可能性があるため、次の送信まで待つこともできません。サーバーが動かなくなる可能性があります。

質問: boost::asio::ip::tcp::socket が CLOSE_WAIT 状態にあるかどうかを判断するにはどうすればよいですか?

4

2 に答える 2

1

ip::tcp::socket::get_option を使用して、レベル SOL_SOCKET とオプション名 SO_ERROR でエラー状態を取得することができます。そのための準備が整ったブーストの実装が見つからないことに驚いています。したがって、GettableSocketOption の要件を満たし、ip::tcp::socket::get_option を使用してソケットのエラー状態を取得できます。

于 2013-09-07T05:50:31.323 に答える