Boost.Asioでソケットが閉じているかどうかを確認する方法は?
-
03-07-2019 - |
質問
接続のリモート側でソケットが閉じられたかどうかを確認する最も簡単な方法は何ですか? socket :: is_open()
は、リモート側で閉じられている場合でもtrueを返します( boost :: asio :: ip :: tcp :: socket
を使用しています) 。
ストリームから読み取って成功するかどうかを確認できますが、プログラムのロジックを変更してこの方法で動作させる必要があります(その時点でストリームからデータを抽出したくないチェックの))。
解決
接続がピアによって完全に閉じられた場合、読み取り中にEOFを取得する必要があります。それ以外の場合、通常、接続が本当に生きているかどうかを確認するためにpingを実行します。
他のヒント
async_receive
ハンドラーで boost :: asio :: error :: eof
エラーを確認してください。接続が閉じられたことを意味します。これが唯一の適切な方法です。
利用可能なブーストピーク機能はありますか?ほとんどのソケット実装には、キューからデータを削除せずにデータを読み取る方法があるため、後で再度読み取ることができます。これは要件を満たすようです。
asio docsをざっと眺めた後、私が期待していたものを正確に見つけることができませんでしたが、それがそこにないという意味ではありません。
こちら初心者向け。
一般に、ソケットを開いたら、すぐに読み始めて、決してやめないでください。このようにして、サーバーまたはクライアントが同期プロトコルと非同期プロトコルの両方をサポートするようにすることができます。クライアントが接続を閉じた瞬間、読み取りがこれを知らせた瞬間。
error_codeを使用すると、クライアントが接続されているかどうかを確認できます。接続が成功した場合、error_code error.value()は0を返し、それ以外の場合は他の値を返します。 error_codeからmessage()を確認することもできます。