したがって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 の実装が読み取りに依存していると問題が発生すると思われます。)