------

[ AD ] Port Monitor ( Try to use a Best WebSite Monitoring Tool )

------
전체에서 Integer 4bytes만 복사 === 나머지 길이
전체에서 Integer 4bytes만 복사
LRESULT CChatClientDlg::OnSocketMsg( WPARAM wParam , LPARAM lParam )
{

	SOCKET sock = (SOCKET)wParam;

	//에러체크
	int nError = WSAGETSELECTERROR( lParam );
	if( 0 != nError )
	{
		OutputMsg( "[에러] WSAGETSELECTERROR : %d ", nError );
		m_AsyncSocket.CloseSocket( sock );
		return false;
	}
	
	//이벤트 체크
	int nEvent = WSAGETSELECTEVENT( lParam );

	switch( nEvent )
	{
	case FD_READ:
		{
			int nRecvLen = recv( sock , m_szSocketBuf + m_nRestRecvLen , MAX_SOCKBUF , 0 );
			if( 0 == nRecvLen )
			{
				OutputMsg("[CLOSE] 클라이언트와 연결이 종료 되었습니다.");
				m_AsyncSocket.CloseSocket( sock );
				return false;
			}
			else if( -1 == nRecvLen )
			{
				OutputMsg("[ERROR] recv 실패 : %d " , WSAGetLastError() );
				m_AsyncSocket.CloseSocket( sock );
			}

			m_nRestRecvLen += nRecvLen;

			//패킷길이의 크기보다 적게 들어왔다면
			if( m_nRestRecvLen < 4 )
				return true;
			//패킷의 길이를 얻어온다.
			int nMsgLen = 0;
			char* pCurrent = m_szSocketBuf;
			CopyMemory( &nMsgLen , pCurrent , 4 );
			//하나의 완전한 패킷을 모두 받았다면.. 
            while( nMsgLen >= m_nRestRecvLen )
			{
				ProcessPacket( m_szSocketBuf , nMsgLen );
//				nMsgLen -=m_nRestRecvLen;
				m_nRestRecvLen -= nMsgLen;
				if( m_nRestRecvLen <= 0 )
					break;
				pCurrent += nMsgLen;
				CopyMemory( &nMsgLen , pCurrent , 4 );
			}
			MoveMemory( m_szSocketBuf , pCurrent , m_nRestRecvLen );

			break;
		}
	case FD_CLOSE:
		{
			OutputMsg("[CLOSE] 클라이언트 접속 종료 : SOCKET(%d)", sock );
			m_AsyncSocket.CloseSocket( sock );
		}
		break;
	}
	return true;

}



5,6번째 자리 복사 하면 -===> 명령어 자리
::ProcessPacket( char* pRecvBuf , int nRecvLen )
{
	unsigned short usType;
	CopyMemory( &usType , pRecvBuf + 4 , 2 );
	switch( usType )
	{
	case PACKET_CHAT:
		{
			Packet_Chat* pChat = (Packet_Chat*)pRecvBuf;
			OutputMsg("[%d] : %s", pChat->s_sIndex , pChat->s_szChatMsg );
		}
		break;
	case PACKET_MOVE:
		{
			OutputMsg("[Move]");
		}
		break;
	default:
		OutputMsg("[ERROR] 정의되지 않은 메시지 도착");
		break;
	}

}


'온라인게임 > vc++' 카테고리의 다른 글

IO Completion Port  (0) 2010.10.06
vs 2010 팁 ( visual studio 추가 설치 파일 )  (0) 2010.10.05
숭실대학교 미디어대학원 컴퓨터그래픽스 Magic  (0) 2010.10.05
MFC 표기법  (0) 2010.10.05
기능  (0) 2010.10.05

+ Recent posts