【问题标题】:According to the doc of boost 1.68, old io_context::post is deprecated. boost::asio::post() is recomanded. Can anyone give me an example?根据 boost 1.68 的文档,不推荐使用旧的 io_context::post 。推荐使用 boost::asio::post()。谁能给我一个例子?
【发布时间】:2018-10-20 15:10:39
【问题描述】:

我想使用 asio::io_context::post 的特性。但我发现它被标记为已弃用

You can see it here (不推荐使用:使用 boost::asio::post()。)请求 io_context 调用给定的处理程序并立即返回。

然后我想尝试一下 boost::asio::post(),但我无法想象如何编写代码。没有示例,没有代码,甚至没有更多文档。

你能帮帮我吗? 非常感谢。

【问题讨论】:

    标签: c++ boost asio


    【解决方案1】:

    我的 RTSP 服务器中有一个使用 boost.asio 的真实示例:

    using udp_buffer = std::array<char, 0xFFFF>;
    using shared_udp_socket = std::tuple<boost::asio::ip::udp::socket,
                    boost::asio::io_context::strand,
                    udp_buffer,
                    boost::asio::ip::udp::endpoint>;
    
    void rtsp::rtsp_server::handle_incoming_udp_traffic(const boost::system::error_code &error,
                                                        std::size_t received_bytes,
                                                        rtsp::rtsp_server::shared_udp_socket &incoming_socket) {
        if (error)
            throw std::runtime_error{error.message()};
    
        auto data = std::make_shared<std::vector<char>>();
    
        std::copy_n(std::get<2>(incoming_socket).cbegin(), received_bytes, std::back_inserter(*data));
        boost::asio::ip::udp::endpoint received_from_endpoint = std::get<3>(incoming_socket);
    
        boost::asio::post(std::get<1>(incoming_socket).get_io_context(),
                          std::bind(&rtsp::rtsp_server::handle_new_incoming_message,
                                    data, std::ref(incoming_socket),
                                    received_from_endpoint,
                                    std::ref(this->server_state_))
        );
    
        start_async_receive(incoming_socket);
    }
    void rtsp::rtsp_server::handle_new_incoming_message(std::shared_ptr<std::vector<char>> message,
                                                    shared_udp_socket &socket_received_from,
                                                    boost::asio::ip::udp::endpoint received_from_endpoint,
                                                    server::rtsp_server_state &server_state {...}
    

    在那里你可以看到我如何使用boost::asio::post 将传入 UDP 数据报的处理发布到 iocontext,同时开始通过start_async_receive 重新侦听 udp 套接字上的新传入数据报。如果您需要进一步解释,请告诉我。

    【讨论】:

    • 您为什么要使用 tuple&lt;&gt; 而不是 struct 与相同的成员?
    • 好问题,我不知道。也许是因为我认为“这就是 tuple 的用途”。经过一番思考,我会说,不要用结构定义混淆接口,但因为这是一个私有接口,也不算数。我想我应该在某个时候重构它。
    • 这就是我想要的。非常感谢你。代码看起来很奇怪......
    • 不要让自己被我的整个 tuple shebang 所迷惑,因为套接字对象不是线程安全的,并且从发件人收到的下一个端点是通过 boost 引用获取的,这是我的方式将传入的 UDP 消息多路分解到处理程序,该处理程序稍后将回复 UDP 发送者端点,并通过链同步。我说 UDP socketS 是因为您已经需要一个用于 IPv4 和一个用于 IPv6。 TCP 连接处理稍微简单一些。 (RTSP 支持 UDP 和连接语义,因此在其他情况下,您可以更简单地执行此操作)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2020-05-24
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多