增强异步插座和Boost ::线程

boost async sockets and boost::thread

本文关键字:线程 Boost 异步 插座 增强      更新时间:2023-10-16

i编写TCP客户端,该客户端应该能够同时发送和接收数据。您能告诉我如何调用async_sendasync_receive是单独的线程?

换句话说如何调用

m_Socket.async_send(boost::asio::buffer(txBuf.c_str(), txBuf.length()+1),
    boost::bind(&TCPClient::sendingHandler, this, boost::asio::placeholders::error));
m_Socket.async_receive(boost::asio::buffer(rxBuf, maxBufLen),
    boost::bind(&TCPClient::sendingHandler, this, boost::asio::placeholders::error));

boost::thread receivingThread(boost::bind(...));
boost::thread sendingThread(boost::bind(...));

,如果我再次在处理程序内再次致电async_sendasync_receive,它会正确工作吗?我需要一个不定式的循环来发送/收款数据。

主要思想是 - 在2 io_service's上的 TCPClient::sendingHandler/receivingHandler中发送和接收。此io_service's在2个线程中被称为 -

boost::thread receivingThread(boost::bind(...));
boost::thread sendingThread(boost::bind(...));

在本教程中清楚地看到了这个想法。您要致电并使用2个单独的io_service's的唯一区别。

另一个选项是1 io_service,而乘线乘以调用 io_service::run。但是您必须使用boost::asio::strand远线安全:

boost::asio::strand* _strand = new boost::asio::strand(io);
//then use it in handlers
boost::asio::async_read(*socket, 
                    boost::asio::buffer(msg.data(), result.size),
                    (*_strand).wrap(
                    boost::bind(&ConnectionInterface::parsePacket, shared_from_this(), boost::asio::placeholders::error)));