boost asio tcp socket 1.70 不向后兼容

Posted

技术标签:

【中文标题】boost asio tcp socket 1.70 不向后兼容【英文标题】:boost asio tcp socket 1.70 not backward compatible 【发布时间】:2020-02-15 13:53:15 【问题描述】:

我将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::socketbasic_stream_socket&lt;tcp&gt; 的 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&lt;boost::asio::executor&gt; 类型的链并将套接字保留为默认执行器类型来反转。 【参考方案1】:

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

【讨论】:

以上是关于boost asio tcp socket 1.70 不向后兼容的主要内容,如果未能解决你的问题,请参考以下文章

将 std::bind 应用于带有参数 <boost::asio::ip::tcp::socket> 的函数时出错?

如何获取 boost::asio::ip::tcp::socket 的 IP 地址?

使用 boost::asio::ip::tcp::socket 作为 shared_ptr

Boost Asio总结class tcp

boost asio tcp socket 1.70 不向后兼容

C++ Boost.Asio - tcp 套接字异步写入