boost asio 채팅 소스 질문염 ㅠ
글쓴이: balgarac1 / 작성시간: 화, 2015/02/03 - 6:25오후
소스가 잘 이해가 안되서 질문드립니다...
소스에서 bImmediately 변수의 의미도 잘 모르겠고
handle_receive함수와 processPacket 함수의 소스가 잘 이해가 되지 않습니다..
설명좀 부탁드려요.. ㅜ
void PostSend( const bool bImmediately, const int nSize, char* pData ) { char* pSendData = nullptr; EnterCriticalSection(&m_lock); // 락 시작 if( bImmediately == false ) // 이 변수의 의미는ㄴ .. ㅠㅠ { pSendData = new char[nSize]; memcpy( pSendData, pData, nSize); m_SendDataQueue.push_back( pSendData ); } else { pSendData = pData; } if( bImmediately || m_SendDataQueue.size() < 2 ) { boost::asio::async_write( m_Socket, boost::asio::buffer( pSendData, nSize ), boost::bind( &ChatClient::handle_write, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred ) ); } LeaveCriticalSection(&m_lock); // 락 완료 } void handle_receive( const boost::system::error_code& error, size_t bytes_transferred ) { if( error ) { if( error == boost::asio::error::eof ) { std::cout << "클라이언트와 연결이 끊어졌습니다" << std::endl; } else { std::cout << "error No: " << error.value() << " error Message: " << error.message() << std::endl; } Close(); } else { memcpy( &m_PacketBuffer[ m_nPacketBufferMark ], m_ReceiveBuffer.data(), bytes_transferred ); int nPacketData = m_nPacketBufferMark + bytes_transferred; // int nReadData = 0; // 이 두 라인과 while( nPacketData > 0 ) { if( nPacketData < sizeof(PACKET_HEADER) ) // 이 조건문은 왜 필요한 거죠?? { break; } PACKET_HEADER* pHeader = (PACKET_HEADER*)&m_PacketBuffer[nReadData]; if( pHeader->nSize <= nPacketData ) { ProcessPacket( &m_PacketBuffer[nReadData] ); nPacketData -= pHeader->nSize; nReadData += pHeader->nSize; } else { break; } } if( nPacketData > 0 ) { char TempBuffer[MAX_RECEIVE_BUFFER_LEN] = {0,}; memcpy( &TempBuffer[ 0 ], &m_PacketBuffer[nReadData], nPacketData ); memcpy( &m_PacketBuffer[ 0 ], &TempBuffer[0], nPacketData ); } m_nPacketBufferMark = nPacketData; PostReceive(); } } void ProcessPacket( const char*pData ) { PACKET_HEADER* pheader = (PACKET_HEADER*)pData; switch( pheader->nID ) { case RES_IN: { PKT_RES_IN* pPacket = (PKT_RES_IN*)pData; LoginOK(); std::cout << "클라이언트 로그인 성공 ?: " << pPacket->bIsSuccess << std::endl; } break; case NOTICE_CHAT: { PKT_NOTICE_CHAT* pPacket = (PKT_NOTICE_CHAT*)pData; std::cout << pPacket->szName << ": " << pPacket->szMessage << std::endl; } break; } }
File attachments:
첨부 | 파일 크기 |
---|---|
ChattingTCPClient.zip | 2.65 KB |
Forums:
boost::asio에서
기본적으로 asynchronous로 동작한다는게 무엇을 의미하는지 아신다고 생각하고,
본문에 적힌 "handle_receive"는 함수명으로 보아, asyn_read() 호출 할 때 parameter로 넘겨질 것으로 생각되는데요,
asyn_read()를 통해서 데이터를 수신하였을 때, 자동으로 "handle_receive"을 호출 해 줍니다.
asynchronous(비동기적)으로요.
댓글 달기