-1

ソケットが切断されているかどうかを単純に検出することは不可能であることはすでに知っています。サーバーとクライアントは、Skypeの場合と同じように、「聞こえますか?」と「ええ、できます。 」と必要があります。
しかし、boost::asioソケットが反対側から切断されていると、ソケットから読み取ろうとすると、手に負えない例外が発生します。これは、私にとって十分に役立つ一種の切断検出です。その例外を処理できますか?クラッシュする代わりに、プログラムはコンソールにメッセージを生成しますか?
すべてのためにそれを必要とする人のためのいくつかのコード:

bool SocketClient::read(int bytes, char *text) {
      char buffer = 0;
      int length = 0;
      while(bytes>0) {
        size_t len = sock.receive(boost::asio::buffer(&buffer, 1));  //boom: UNHANDLED EXCEPTION
        bytes--;
        text[length] = buffer;
        length++;

      }
      return true;
}

私はMinecraftサーバーに接続しているので、クライアントが切断されたときを知っています-読み取り/書き込みの試行で例外が発生します。

4

1 に答える 1

3
try
{
    size_t len = sock.receive(boost::asio::buffer(&buffer, 1));  //boom: UNHANDLED EXCEPTION
    // More code ...
}
catch (const boost::system::system_error& ex)
{
  if ( ex.code() == boost::asio::error::eof ) 
  {
    // Work your magic (console logging, retry , bailout etc.)
  }
}

ドキュメントもご覧ください。最悪の場合、デバッガーから例外タイプを推測できます:)

于 2013-03-15T23:50:46.730 に答える