问题描述
Linux和Windows均支持TCP keep-alive
数据包.可以通过(依赖于系统的)setsockopt
调用来激活和配置它们,例如,参见本文适用于Linux.使用boost::asio
时,似乎支持保持活动消息,请参见当前文档.但是,该页面仅涵盖激活它.在对旧帖子的一些新回复中 a>有人指出,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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!