所以我有一个使用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实现依赖于读取它会导致问题。)
答案 0 :(得分:0)
在一般情况下,您必须实现一些应用程序级机制来检测各种断开连接。 关于boost / asio ML的讨论很多,here is on of them。
答案 1 :(得分:0)
您可以启用套接字选项TCP_KEEPALIVE,但仍需要挂起的读取操作才能接收失败读取的通知。