我正在使用boost :: asio通过简单的P2P连接在套接字上进行通信。 Linux上始终仅连接一台客户端和一台服务器。我已经在套接字上打开了TCP keep_alive functionality。在我的套接字上设置了以下3个值,这几乎可以很好地完成工作。本身的功能没有问题。
代码:
int on = 1;
if (setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(int)) == -1)
throw std::logic_error("Not able to set TCP_NODELAY");
int timeOut = 3; //seconds
if (setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPIDLE, &timeOut, sizeof(int)) == -1)
throw std::logic_error("Not able to set TCP_KEEPIDLE");
if (setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPINTVL, &timeOut, sizeof(int)) == -1)
throw std::logic_error("Not able to set TCP_KEEPINTVL");
int unackCount = 1;
if (setsockopt(socketNativeHandle, IPPROTO_TCP, TCP_KEEPCNT, &unackCount, sizeof(int)) == -1)
throw std::logic_error("Not able to set TCP_KEEPCNT");
如果断开连接,我等待的boost::asio::async_read会在回调中收到错误。几乎是标准的东西。而且效果很好。
问题:
但是,有一个有趣的问题。如果我的同伴刚刚建立连接并且在大约一个小时内未进行任何数据包事务,那么一个小时后,我将收到一个错误消息boost::system::errc
,其消息状态为Connection timed out
或有时为Operation timed out
。这来自async_read
回调,该回调始终在套接字上等待数据。
查看boost :: asio源代码中的enum errc_t
,错误代码看起来是ETIMEDOUT
。
问题:
这是因为我在tcp套接字中缺少与keep_alive
相关的某些属性吗?
我的boost::asio::async_read
实际超时了吗?我还没有设置超时时间。因此,我不希望它超时。
两个对等方都使用的操作系统是 Linux 。