boost :: Beast Sync http客户端的超时
Timeout for boost::beast sync http client
我正在从Boost Beast示例中调整同步HTTP客户端。不幸的是,示例客户端不包括超时选项,有时会陷入我的工作量中。我尝试使用
添加超时beast::get_lowest_layer(stream).expires_after(NetworkSettings::BASIC_TIMEOUT);
在调用写入/读取操作之前,但是使用async_read/write时,这些操作似乎只能工作。据我发现,似乎基本的Boost Asio仅支持异步操作的超时。所以我的问题是,野兽是否有任何功能在封锁连接/读/写呼叫上使用超时。
超时不适用于ASIO的同步I/O。由于野兽是ASIO上方的一层,因此它也不支持同步I/O的超时。如果需要超时,则必须使用异步API。您可以使用堆叠的Coroutine,或者如果您有足够的现代编译器,则可以尝试使用无型Coroutines(co_await
(。这些允许您编写出现同步但使用异步接口的代码。
野兽文档对此很清楚:"出于可移植性原因,网络不提供同步流操作的超时或取消功能。"
https://www.boost.org/doc/libs/1_70_0/libs/beast/doc/html/beast/beast/using_io/time_io/timeouts.html
如果您想在连接操作上有超时,请使用beast::tcp_stream
的实例并调用async_connect
成员函数:
您可以使用类似的东西。
尝试将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();
3(您需要另一个线程来执行ioc.run();
,因为我们通过异步嘲笑同步 - 有人必须运行事件 - 循环。
另一种方法:您可以使用其本机句柄明确设置套接字选项(我从未做过(。但是在此之前,请阅读此答案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指定接收或发送超时 直到报告错误。该论点是一个结构时空。如果 此期间的输入或输出功能块,数据具有 已发送或接收,该功能的返回值将是 传输的数据量;如果没有传输数据,并且 已经到达超时了,然后将errno设置为eagain返回-1 或ewoldblock或einprogress(对于连接(2((,就像插座一样 被指定为非块。如果超时设置为零( 默认值(然后操作将永远不会超时。超时只有 对执行插座I/O的系统调用的效果(例如,读(2(, RECVMSG(2(,send(2(,sendmsg(2((;超时没有影响 选择(2(,民意调查(2(,epoll_wait(2(等等。
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 如何将函数集合传递给客户端类,以便将它们当作客户端类本身的成员使用
- 使用调试/崩溃报告将应用程序部署到客户端
- 如何在本地机器上运行c++和javascript客户端代码(hackerbank风格)
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 从服务器传输到客户端的消息不会出现
- OpenSSL TLS服务器-使用客户端证书白名单
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- boost :: Beast Sync http客户端的超时
- 如何在 gRPC 的异步C++客户端中为每个请求设置超时?
- Apache Thrift C++服务器超时客户端连接
- GRPC:客户端超时
- 是否可以更改HTTP客户端超时期限(cpp-netlib)
- C++中的Bittorrent客户端,在非阻塞套接字上连接到对等端总是超时
- 在选择函数中检测超时的客户端
- 如何设置从非阻塞模式的服务器客户端接收消息的超时
- 客户端套接字连接() 在服务器 accept() 超时后成功
- TCP服务器为每个客户端设置超时时间
- Udp选择超时问题.超时或从所有客户端读取
- Boost asio异步http客户端超时