场景:
我有一个使用boost::asio 1.63编写的客户端和服务器。通常,连接和通信部分效果很好。
我在两边都写了一个看门狗,它以2秒的间隔将虚拟数据包发送给同级。看门狗的目的是,如果相关对等方未收到在接下来的2秒内期望的虚拟数据包,则报告连接错误。这对我来说尤为重要,因为这可能会导致2个对等端未出于任何用户目的进行事务处理,但是如果任何一个对等端发生故障,则每个对等端都需要报告连接错误。即使由于内核崩溃而导致对等体崩溃,在这种情况下,该对等体也无法发送消息。当然,这是一个经典问题,甚至超出了asio和TCP。
我的看门狗工作得很好。完全没有问题。
但是,最近,我了解了套接字中的keep_alive功能。我尝试了以下代码,并且似乎可以通过使用boost::asio
从代码中获取套接字的本机句柄,从而在TCP套接字上实现一个名为keep_alive的属性。
boost::asio::io_service ioService;
boost::asio::ip::tcp::socket mySocket(ioService);
int on = 1;
int delay = 120;
setsockopt(mySocket.native_handle(),SOL_SOCKET,SO_KEEPALIVE,&on,sizeof(on));
setsockopt(mySocket.native_handle(),IPPROTO_TCP,TCP_KEEPALIVE,&delay,sizeof(delay));
问题:
上面的代码可以在macOS,Linux和iOS上很好地编译。看起来很棒。但是,我如何从中受益呢?当同伴崩溃时,这是否给我回调或事件?这是否使我免于编写上文所述的看门狗?
我已使用boost::asio::async_connect
连接到同级。如果在定义的超时时间间隔后perr下降,是否可以对我的connectionHandler进行回调?
设置了keep_alive
选项后,我如何知道对等方不再响应了?