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:
| 첨부 | 파일 크기 |
|---|---|
| 2.65 KB |
Forums:


boost::asio에서
기본적으로 asynchronous로 동작한다는게 무엇을 의미하는지 아신다고 생각하고,
본문에 적힌 "handle_receive"는 함수명으로 보아, asyn_read() 호출 할 때 parameter로 넘겨질 것으로 생각되는데요,
asyn_read()를 통해서 데이터를 수신하였을 때, 자동으로 "handle_receive"을 호출 해 줍니다.
asynchronous(비동기적)으로요.
댓글 달기