c++ - boost::beast 同步 http 客户端超时
问题描述
我正在改编Boost Beast 示例中的同步 HTTP 客户端。不幸的是,示例客户端不包含超时选项,有时会卡在我的工作负载中。我尝试添加超时
beast::get_lowest_layer(stream).expires_after(NetworkSettings::BASIC_TIMEOUT);
在调用写/读操作之前,但那些似乎只在使用 async_read/write 时起作用。从我的发现看来,基本的 boost asio 似乎只支持异步操作的超时。所以我的问题是,野兽是否有能力在阻塞的连接/读/写调用上使用超时。
解决方案
超时不适用于 Asio 中的同步 I/O。由于 Beast 是 asio 之上的一层,它也不支持同步 I/O 的超时。如果您想要超时,则必须使用异步 API。您可以使用堆栈式协程,或者如果您有足够现代的编译器,您可以尝试使用无堆栈式协程 ( co_await
)。这些允许您编写看似同步但使用异步接口的代码。
Beast 文档对此很清楚: “出于可移植性的原因,网络不为同步流操作提供超时或取消功能。”
https://www.boost.org/doc/libs/1_70_0/libs/beast/doc/html/beast/using_io/timeouts.html
如果您希望连接操作超时,请使用以下实例beast::tcp_stream
并调用async_connect
成员函数:
https://www.boost.org/doc/libs/1_70_0/libs/beast/doc/html/beast/using_io/timeouts。 html#beast.using_io.timeouts.connecting
推荐阅读
- php - 从不同于我正在工作的 PHP 服务器发送 mail()
- c# - 为什么派生类中不调用该方法
- excel - 为什么我在打破公式时会出错?
- c# - null 的可空日期时间验证
- java - Makefile:致命错误:jni.h:没有这样的文件或目录
- mysql - 如何使用 Play JSON 为 MySQL 创建 Doobie Meta 实例?
- java - JPA:如何仅与 ID 而不是对象建立关系?
- python-3.x - 在单类汽车上训练,但预测其他类
- visual-studio-code - 在 VS Code 中,有没有办法打开所有有合并冲突的文件?
- javascript - 添加播放按钮以触发javascript时间滑块?