【发布时间】:2024-01-20 21:55:01
【问题描述】:
我将boost-beast 用于我的http 服务器。我开始根据 boost beast 文档(可能是 1.66 版)上提供的示例编写服务器。现在在 boost 1.70 之后我遇到了编译问题。即使使用 1.69,一切都运行良好。问题出在我的 session 类中。
template <typename RouterT>
class session{
boost::asio::strand<boost::asio::io_context::executor_type> _strand;
boost::asio::ip::tcp::socket _socket
// ...
explicit session(RouterT& router, boost::asio::ip::tcp::socket socket, std::shared_ptr<std::string const> const& doc_root)
: _router(router),
_socket(std::move(socket)),
_strand(_socket.get_executor()),
_doc_root(doc_root),
_lambda(*this){
}
};
升级到 1.71 时出现以下错误
error: no matching function for call to ‘boost::asio::strand<boost::asio::io_context::executor_type>::strand(boost::asio::basic_socket<boost::asio::ip::tcp, boost::asio::executor>::executor_type)’
但是strand 的定义从 1.69 到 1.70 并没有太大变化。所以这不应该是这个错误背后的问题。
boost::asio::ip::tcp::socket 是 basic_stream_socket<tcp> 的 typedef,默认为 executor。这样executor 就不能转换为strand 所需的boost::asio::io_context::executor_type。
所以我现在使用的不是普通的boost::asio::ip::tcp::socket
typedef boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::io_context::executor_type> socket_type;
我不确定此修改是否适用于旧版本的 boost
这是正确的解决方案吗?或者我应该让tcp::socket的执行者来构建链?
【问题讨论】:
-
我想指出,您的解决方案可以通过声明
boost::asio::strand<boost::asio::executor>类型的链并将套接字保留为默认执行器类型来反转。
标签: c++ sockets boost version boost-beast