use*_*472 2 c++ tcp boost-asio
Linux和Windows都支持TCP keep-alive数据包.它们可以通过(系统相关的)setsockopt调用来激活和配置,例如参见本文的Linux案例.使用boost::asio时似乎支持保持活动消息,请参阅当前文档.但该页面仅涵盖激活它.在对旧帖子的几个新回复中,有人指出Boost最近添加了配置操作超时的方法(这消除了对不同系统的需求setsockopt和#ifdef代码分支).但是,最近的响应仍然建议调用本机套接字.
我的问题是:如何配置保持活动包的时间间隔和超时boost::asio?
您可以使用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)
| 归档时间: |
|
| 查看次数: |
10768 次 |
| 最近记录: |