你可以使用这样的东西。
尝试更改stream.connect(results)
为
auto Future = stream.async_connect(endpoint, net::use_future);
if(Future.wait_for(std::chrono::seconds(1)) == std::future_status::timeout){
std::cout<<"timed_out";
....
}else {
}
一堆需要注意的事情:
1)您可能需要以下头文件
#include<boost/asio/use_future.hpp>
#include<chrono>
#include<future>
2)因为你是 asyc_* 发起的;你需要打电话ioc.run();
ioc.run();
3)当我们通过异步模拟同步时,您需要另一个线程来执行——必须有人运行事件循环。
另一种方法:您可以使用其本机句柄显式设置套接字选项(我从未这样做过)。但在此之前,请阅读此答案https://stackoverflow.com/a/51850018/5198101
const int timeout = 200;
::setsockopt(socket.native_handle(), SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof timeout);//SO_SNDTIMEO for send ops
https://linux.die.net/man/7/socket
SO_RCVTIMEO 和 SO_SNDTIMEO 指定接收或发送超时,直到报告错误。参数是 struct timeval。如果输入或输出函数在这段时间内阻塞,并且数据已经发送或接收,则该函数的返回值将是传输的数据量;如果没有数据被传输并且已经达到超时,则返回 -1 并将 errno 设置为 EAGAIN 或 EWOULDBLOCK 或 EINPROGRESS(对于 connect(2)),就像将套接字指定为非阻塞一样。如果超时设置为零(默认值),则操作将永远不会超时。超时仅对执行套接字 I/O 的系统调用有效(例如 read(2)、recvmsg(2)、send(2)、sendmsg(2));超时对 select(2)、poll(2)、epoll_wait(2) 等无效。