Configuring TCP keep_alive with boost::asio(使用 boost::asio 配置 TCP keep_alive)
问题描述
Linux 和 Windows 都支持 TCP keep-alive
数据包.它们可以通过(依赖于系统的)setsockopt
调用来激活和配置,参见例如这篇文章 适用于 Linux 案例.使用 boost::asio
时,似乎支持保持活动消息,请参阅 当前文档.但是,该页面仅涵盖激活它.在对旧帖子 有人指出 Boost 最近增加了在操作上配置超时的方法(这避免了对不同系统的 setsockopt
和 #ifdef
代码分支的需要).但是,最近的回复 仍然建议调用本机套接字.
Both Linux and Windows support TCP keep-alive
packets. They can be activated and configured with (system-dependent) setsockopt
calls, see e.g. this article for the Linux case. When using boost::asio
there appears to be support for keep-alive messages, see the current documentation. However that page only covers activating it. In several new responses to an older post it was pointed out that Boost has recently added the means to configure timeouts on operations (which obviates the need for setsockopt
and #ifdef
code-branches for different systems). However, a recent response still suggests calls on the native sockets.
我的问题是:如何使用 boost::asio
配置保持活动数据包的时间间隔和超时?
My question is: How can I configure the time interval and timeouts of keep-alive packets using boost::asio
?
推荐答案
您可以使用 setsockopt 选项配置发送超时和接收超时.下面是一些在 windows 和 linux/unix 上执行此操作的平台相关代码,该示例将发送和接收超时设置为相同的 10 秒值:
You can configure both the send timeout and receive timeout using the setsockopt options. Here is some platform-dependent code to do this on both windows and linux / unix, the example sets both send and receive timeouts to the same ten second value:
// 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 配置 TCP keep_alive的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 boost::asio 配置 TCP keep_alive
基础教程推荐
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 从 std::cin 读取密码 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01