使用boost :: asio配置TCP keep_alive

use*_*472 2 c++ tcp boost-asio

Linux和Windows都支持TCP keep-alive数据包.它们可以通过(系统相关的)setsockopt调用来激活和配置,例如参见本文的Linux案例.使用boost::asio时似乎支持保持活动消息,请参阅当前文档.但该页面仅涵盖激活它.在对旧帖子的几个新回复中,有人指出Boost最近添加了配置操作超时的方法(这消除了对不同系统的需求setsockopt#ifdef代码分支).但是,最近的响应仍然建议调用本机套接字.

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

Rio*_*iot 8

您可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 所以答案是`boost :: asio`只允许激活它,但不提供任何配置它的方法.那么我会选择你的解决方案.毕竟,使用本机套接字实际上不是问题. (2认同)
  • 确实 - 我认为理由是并非每个实现都允许相同的配置选项,因此asio选择将潜在的特定于平台的配置留给用户. (2认同)
  • 老实说,这不符合OP的问题.Keepalive值在posix上使用SOL_TCP,{TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT}设置,并使用SOL_SOCKET,SO_KEEPALIVE启用 (2认同)
  • 实际上,OP的评论是"你可以在boost asio**中设置...套接字选项**吗?我的答案是asio特定的;你的评论只是指posix.Boost asio也适用于非posix系统. (2认同)