2

したがってio_service::poll()、現在準備ができている読み取り/書き込みイベントを処理するために使用するサービス メソッドがあります。

void Foo::service()
{
  io.poll(); // boost::asio::io_service
  if (socket.is_open())
    if (socket.available())
      notifyReadyToRead();
    else
      notifyReadyToWrite();
}

ただし、リモートソケットが閉じた場合 (正常にまたはそうでない場合) にも動作をトリガーしたいと思います。この状況でネットワーク イベントが発生するため、Winsock でこれを処理できることはわかっています。ただし、Boost Asio ソケットには、これに対するサポートが組み込まれていないことがわかります。

boost::asio::buffer(socket, 0)エラーがないかどうかをテストするために、ソケットにゼロバイトのパケットを読み書きしようとしましたが、ソケットを実際にチェックせずに渡すと、実装が成功するようです。

また、ハングした読み取り操作をそのままにしておくとうまくいくと聞いたことがありますが、通常boost::asio::readの「boost::asio::write」操作を正しく機能させながら、これを管理する方法がわかりません。

最後に、アプリ レベルのプロトコルに ping 操作を追加することはできません。このクラスは一般的に使用されることを意図しており、そうでなかったとしても、リモート側のプロトコルを変更することはできません。

私は移植可能なソリューションを好みますが、ネイティブ ハンドルを取得してイベントを列挙することを意味する場合でも、Windows 固有のソリューションで十分です。(これは私に起こりましたがWSAEnumNetworkEvents、イベントの内部記録をクリアするので、boost::asio の実装が読み取りに依存していると問題が発生すると思われます。)

4

2 に答える 2

0

ソケット オプション TCP_KEEPALIVE を有効にすることはできますが、読み取り失敗の通知を受け取るには保留中の読み取り操作が必要です。

于 2012-10-29T00:45:18.063 に答える
0

一般に、あらゆる種類の切断を検出するには、何らかのアプリケーション レベルのメカニズムを実装する必要があります。このトピックについては、boost/asio ML に関する多数の議論がありました

于 2012-10-27T12:39:00.227 に答える