2012-10-25 4 views
3

동시에 데이터를주고받을 수 있어야하는 TCP 클라이언트를 작성합니다. async_sendasync_receive을 별도의 스레드라고 어떻게 부를 수 있습니까? 다른 말로부스트 비동기 소켓 및 부스트 :: 스레드

방법

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

에서

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)); 

를 호출하는 내가 핸들러 내부에 다시 ​​async_send 또는 async_receive를 호출하는 경우 올바르게 작동합니까? 데이터를 전송/수신하기위한 무한 반복이 필요합니다.

+2

동시 송수신을 위해 별도의 스레드가 필요하지 않습니다. 같은 스레드에서'async_send'와'async_receive'를 호출하면,'io_service'가 그것을 대신 할 것입니다. –

답변

2

주요 아이디어는 2 io_service'sTCPClient::sendingHandler/receivingHandler 내부에서 재귀 호출로 보내고받습니다. 이 io_service's 2 개 스레드 내에서 호출되는 -

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

이 아이디어는 명확하게 tutorial에서 볼 수있다. 당신이 전화하고 사용해야하는 유일한 차이는 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))); 
+0

2'io_service'를 생성해야합니다. easio'io_service'에서 재귀 호출'async_recieve (boost :: bind (recievingHandler))'/'async_send (boost :: bind (sendingHandler))'를 사용해야합니다. 내가 맞습니까? – Torrius

+0

예, 제가 튜토리얼을 보았습니다 –

+0

그래, 자습서가 명확합니다. 그러나 2 개의'io_service'를 사용하는 것은 명확하지 않습니다. 2'io_service'는 2 개의 소켓을 만드는 것을 의미합니다, 안 그래요? 그러나 나는 비동기 소켓을 가진 영혼을 찾고 싶다. 나는 io 충돌없이 2 개의 비동기 소켓을 사용하는 것이 합리적이지 않다고 생각한다. 설명해 주시겠습니까? – Torrius