Повысить асинхронные сокеты и повысить:: поток

Я написал 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)));
Другие вопросы по тегам