提升 ASIO TCP 套接字 1.70 不向后兼容



我正在使用boost-beast作为我的http服务器。我开始根据 boost beast 文档(可能是 1.66 版(上提供的示例编写服务器。现在在提升 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是 typedef 的basic_stream_socket<tcp>,默认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 <1.70,因为我没有旧的提升安装。那么这种变化可以吗?

这是正确的解决方案吗?或者我应该让tcp::socket的执行者来构建链?

Boost.Asio引入了一个重大更改。执行器现在是每个 I/O 对象的模板参数。默认类型是executor,即多态包装器。您可以从类型化执行器转换为多态包装器,但不能通过其他方式(编译错误的原因(。您的修复是正确的,但如果您希望它在旧版本的 Boost.Asio 上编译,则可能需要一些 #ifdef。

最新更新