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