如何使用TCP keep_alive属性在无响应的对等事件时得到通知?

场景:
我有一个使用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选项后,我如何知道对等方不再响应了?

adlofboy 回答:如何使用TCP keep_alive属性在无响应的对等事件时得到通知?

如果在异步操作挂起时检测到中断,则将使用适当的错误代码来调用套接字的完成处理程序。

问题在于TCP keep_alive选项并不总是检测到断开连接。

通常,除了实现应用程序级ping /心跳之外,没有可靠的方法来检测突然断开连接。

您还可以看到this thread

本文链接:https://www.f2er.com/3168121.html

大家都在问