2017-11-27 12 views
1

私はうまく動作するクライアントサーバーアプリケーションを持っています。 クライアントがソケット閉じた後に、サーバーにいくつかのメッセージを送信します(呼び出しのシャットダウンとソケットのクローズを())クライアントがいつソケットを閉じたかを知るために、asioサーバーをブーストしてください。

データを読み取るコードのサーバー側は以下の通りです:

while (1) 
{ 
    try 
    { 
     int headerBytesReceived = asio::read(*sock.get(), boost::asio::buffer(inbound_header_)); 
     std::cout << "headerBytesReceived : " << headerBytesReceived << "\n" << std::flush; 
     //....... 
     //....... 
    } 
    catch (system::system_error &e) 
    { 
     std::cout << "Server Error occured! Error code = " 
      << e.code() << ". Message: " 
      << e.what() << "\n"; 
     break; 
    } 
} 

サーバーは、スレッド内のデータを無限ループで読み取ります。 クライアントがソケットを閉じると、ループから優雅に抜け出したいと思います。 今すぐクライアントがメッセージの送信を完了し、ソケットを閉じると、次のエラーでキャッチが呼び出されます。

サーバーエラーが発生しました。エラーコード= asio.misc:2。メッセージ:read:ファイルの最後

接続が閉じられてループを解除する必要があるというキャッチ内のより良い方法がありますか?エラーコードをチェックすることによって? もちろん、私はcoutステートメントを削除することができますが、エラーの内容を記録目的で知りたいと思っています。

答えて

1

を、エラーには、より多くのデータが利用できないことを示すためにboost::asio::error::eofになります。

もちろん、例外を防ぐためにboost::asio::readboost::system::error_codeというオーバーロードを使用することができます。これは、より良い処理でもあります。

エラーをチェックして、接続が正常に終了したことをログで記録できます。

関連する問題