【问题标题】:Configuring TCP keep_alive with boost::asio [duplicate]使用 boost::asio 配置 TCP keep_alive [重复]
【发布时间】:2013-11-25 09:38:19
【问题描述】:

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

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

【问题讨论】:

  • @KillianDS 您引用的帖子涉及SO_RCVTIMEOSO_SNDTIMEO 选项。当前的问题专门处理其他常量。如果您阅读参考文章,您会发现 Linux 系统上的原始选项是 TCP_KEEPIDLETCP_KEEPINTVL。此外,接受的答案建议使用我明确试图避免的原始套接字。
  • 不,它没有,它需要一个本机句柄,这与原始套接字不同。虽然它可能会谈论与您想要的不同的选项,但过程完全相同相同(您甚至在这里接受了一个非常相似的答案,使用相同的选项)。

标签: c++ tcp boost-asio


【解决方案1】:

您可以使用 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

【讨论】:

  • 所以答案是boost::asio 只允许激活它,但不提供任何配置它的方法。那我就用你的解决方案。毕竟,使用原生套接字其实并没有什么问题。
  • 确实 - 我想理由是并非每个实现都允许相同的配置选项,因此 asio 选择将潜在的特定于平台的配置留给用户。
  • 老实说,这并不能回答 OP 的问题。 Keepalive 值在 posix 上使用 SOL_TCP、{TCP_KEEPIDLE、TCP_KEEPINTVL、TCP_KEEPCNT} 设置,并通过 SOL_SOCKET、SO_KEEPALIVE 启用
  • 实际上,OP 的评论是“你能在 boost asio 中设置 ... 套接字选项吗?我的回答是特定于 asio 的;你的评论只是指 posix。Boost asio也适用于非 posix 系统。
  • tv.tv_usec微秒 为单位,而不是毫秒。因此,该行应该是:tv.tv_usec = (timeout_milli % 1000) * 1000;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2012-06-06
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
相关资源
最近更新 更多