boost asio 채팅 소스 질문염 ㅠ

balgarac1의 이미지

소스가 잘 이해가 안되서 질문드립니다...



소스에서 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: 
첨부파일 크기
Package icon ChattingTCPClient.zip2.65 KB
twinwings의 이미지

기본적으로 asynchronous로 동작한다는게 무엇을 의미하는지 아신다고 생각하고,

본문에 적힌 "handle_receive"는 함수명으로 보아, asyn_read() 호출 할 때 parameter로 넘겨질 것으로 생각되는데요,

asyn_read()를 통해서 데이터를 수신하였을 때, 자동으로 "handle_receive"을 호출 해 줍니다.

asynchronous(비동기적)으로요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.