Повысить асинхронные сокеты и повысить:: поток
Я написал TCP-клиент, который должен иметь возможность отправлять и получать данные одновременно. Не могли бы вы сказать мне, как я должен позвонить async_send
а также async_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_send
или же async_receive
опять внутри обработчиков? Мне нужен бесконечный цикл для отправки / получения данных.
1 ответ
Основная идея - отправлять и получать в рекурсии внутриTCPClient::sendingHandler/receivingHandler
на 2 io_service's
, это 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)));