提振.Asio,同一个插座的两个读数

Boost.Asio, two readings by the same socket

本文关键字:两个 Asio 同一个 插座 提振      更新时间:2023-10-16

我正在学习Boost.Asio。我定义了一个类,它的角色是客户端和服务器:

  • 我可以创建连接,发送请求和接收响应(客户端角色)
  • 我可以接受请求并发送响应这些请求(服务器角色)。
  • 我也可以创建订阅:创建连接,发送订阅请求并等待响应。如果远程端点接受请求,它将通过此连接定期向我发送数据。

我希望能够在订阅后发出请求并接收响应,但是当我得到响应时出现了一个问题:在那一刻,套接字等待同时接收订阅和响应。

有时会出现死锁,有时我在等待响应时获得订阅,…

为了阅读,我使用了以下函数:
void async_receive_subscription(const socket& the_socket, read_handler_signature handler)
{
    auto self( this->shared_from_this() );
    boost::asio::async_read(
        the_socket.get(),
        boost::asio::buffer( my_buffer ),
        [this, self, the_socket, my_buffer, handler]
        ( const boost::system::error_code& error,
          std::size_t bytes_transferred )
        {
            the_socket.get().get_io_service().post(
                std::bind(
                handler,
                error,
                bytes_transferred,
                the_socket,
                my_buffer
                )
            );
            // Read the next subscription.
            async_receive_subscription(the_socket, handler);
        }
    );
}
void async_receive(const socket& the_socket, read_handler_signature handler)
{
    auto self( this->shared_from_this() );
    boost::asio::async_read(
        the_socket.get(),
        boost::asio::buffer( my_buffer ),
        [this, self, the_socket, my_buffer, handler]
        ( const boost::system::error_code& error,
          std::size_t bytes_transferred )
        {
            the_socket.get().get_io_service().post(
                std::bind(
                handler,
                error,
                bytes_transferred,
                the_socket,
                my_buffer
                )
            );
        }
    );
}

同一个套接字有可能产生两个响应吗?有什么同步机制可以用来避免这个问题吗?

谢谢。

async_read保证只调用一次处理程序。

在此处理程序被调用之前,不能再调用async_read。

问题:

    你是在多线程中运行io_service吗?如果是这样,你需要通过asio::strand传递你的处理程序。