Boost.Asio,同一个插座的两个读数
Boost.Asio, two readings by the same socket
我正在学习 Boost.Asio。我已经定义了一个具有客户端和服务器角色的class:
- 我可以创建连接、发送请求和接收响应(客户端角色)。
- 我可以接受请求并发送对这些请求的响应(服务器角色)。
- 我也可以创建订阅:创建一个连接,它发送一个订阅请求并等待响应。如果远程端点接受请求,它将通过此连接定期向我发送数据。
我希望能够在订阅后发出请求并接收响应,但是当我收到响应时出现问题:此时正在等待的套接字同时接收到订阅和响应。
有时会出现死锁,有时我在等待响应时收到订阅,...
为了阅读,我使用了以下功能:
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.
传递您的处理程序
我正在学习 Boost.Asio。我已经定义了一个具有客户端和服务器角色的class:
- 我可以创建连接、发送请求和接收响应(客户端角色)。
- 我可以接受请求并发送对这些请求的响应(服务器角色)。
- 我也可以创建订阅:创建一个连接,它发送一个订阅请求并等待响应。如果远程端点接受请求,它将通过此连接定期向我发送数据。
我希望能够在订阅后发出请求并接收响应,但是当我收到响应时出现问题:此时正在等待的套接字同时接收到订阅和响应。
有时会出现死锁,有时我在等待响应时收到订阅,...
为了阅读,我使用了以下功能:
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. 传递您的处理程序