1

サーバーに接続するために使用boost::asio::tcp::socketし、サーバーからバイナリデータを受信するために呼び出し read_some()ます。コードは次のとおりです。

len = sock->read_some(boost::asio::buffer(pBuf), error);

if (error == boost::asio::error::eof) {

    break;

}

else if (error) {

    break;

}

しかし、サーバーがソケットを閉じた後、クライアントは引き続き read_some メソッドでブロックされ、サーバーとの切断を検出できず、エラー メッセージが表示されます。この問題が発生する理由

4

1 に答える 1

2

TCP の上で使用しているプロトコルを正しく実装できなかったか、そのプロトコルの設計上の欠陥が原因です。何も送信せずにサーバーからのデータを永遠に待機するようにプロトコルが指示している場合、プロトコルに問題があります。プロトコルが読み取りをタイムアウトにするか、データを送信するように指示しているのにそれを行っていない場合、プロトコルの実装に欠陥があります。

TCP は、データを送信しようとしていない側が接続損失を検出できることを保証しません。TCP を使用するプロトコルは、これを考慮して設計する必要があります。

于 2012-08-24T02:27:31.493 に答える