首页 > 解决方案 > boost::beast 同步 http 客户端超时

问题描述

我正在改编Boost Beast 示例中的同步 HTTP 客户端。不幸的是,示例客户端不包含超时选项,有时会卡在我的工作负载中。我尝试添加超时

beast::get_lowest_layer(stream).expires_after(NetworkSettings::BASIC_TIMEOUT);

在调用写/读操作之前,但那些似乎只在使用 async_read/write 时起作用。从我的发现看来,基本的 boost asio 似乎只支持异步操作的超时。所以我的问题是,野兽是否有能力在阻塞的连接/读/写调用上使用超时。

标签: c++boostboost-asioboost-beast

解决方案


超时不适用于 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


推荐阅读