使用boost :: asio配置TCP keep_alive

时间:2013-11-25 09:38:19

标签: c++ tcp boost-asio

Linux和Windows都支持TCP keep-alive数据包。可以使用(系统相关的)setsockopt调用激活和配置它们,例如, this article用于Linux案例。使用boost::asio时,似乎支持保持活动消息,请参阅the current documentation。但该页面仅涵盖激活它。在针对older post的几个新响应中,有人指出Boost最近添加了配置操作超时的方法(这消除了对不同系统的setsockopt#ifdef代码分支的需求)。但是,recent response仍建议调用本机套接字。

我的问题是:如何使用boost::asio配置保持活动数据包的时间间隔和超时?

1 个答案:

答案 0 :(得分:6)

您可以使用setsockopt选项配置发送超时和接收超时。这里有一些与平台相关的代码在windows和linux / unix上执行此操作,该示例将发送和接收超时设置为相同的十秒值:

// start IO service    
io_context = new boost::asio::io_context;        

// define a tcp socket object    
tcpsocket = new boost::asio::ip::tcp::socket(*io_context); 

// the timeout value
unsigned int timeout_milli = 10000;

// platform-specific switch
#if defined _WIN32 || defined WIN32 || defined OS_WIN64 || defined _WIN64 || defined WIN64 || defined WINNT
  // use windows-specific time
  int32_t timeout = timeout_milli;
  setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout));
  setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_SNDTIMEO, (const char*)&timeout, sizeof(timeout));
#else
  // assume everything else is posix
  struct timeval tv;
  tv.tv_sec  = timeout_milli / 1000;
  tv.tv_usec = (timeout_milli % 1000) * 1000;
  setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
  setsockopt(tcpsocket->native_handle(), SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
#endif