Exemple #1
0
	void NTCPClient::HandleConnect (const boost::system::error_code& ecode)
	{
		if (ecode)
        {
			LogPrint ("Connect error: ", ecode.message ());
			GetRemoteRouterInfo ().SetUnreachable (true);
			Terminate ();
		}
		else
		{
			LogPrint ("Connected");
			ClientLogin ();
		}	
	}	
Exemple #2
0
// Send가 완료 되지 않았는데 다시 Send를 요청한다면? 어떻게 해야 하나...
// Recv에서 패킷을 다받지 못했거나 더 많이 받았을 때는 어떻게 해야하나...
int CPacketProcess::Procedure(CUser * pUser)
{
	// 이 부분 처리를 어떤 식으로 해야 할지 모르겠다.
	// 따로 클래스를 만들자니.. 머하고.. 동기화도 그렇고..
	// 근데 지금 크리티컬세션을 넣었는데.. 꼭 해야 하나? 솔직히 모르겠다.
	// 지금은 CPU가 한개라서 IOCP 스레드는 한개가 돌아 가니 동기화가 그렇게 필요는 없다.
	// (IOCP는 CPU개수만큼 스레드 스위칭을 한다.)
	// 하지만, CPU가 두개인 컴퓨터라면... ㅜ.ㅠ 어케해야하너....
	// 두개 만들고 테스트 해봐야겠다.
	// 2로 지정을 하고 테스트를 했는데 잘 돌아 간다..
	// 2명으로는 무리인가... 더 많은 사람.. 인터넷 안좋은 사람이 필요하다..-_-;;
	if(m_pProcessThread == NULL)
	{
		ServerLog()->Log("CPacketProcess Var Init Error.");
		return PROCEDURE_ERROR;
	}

	char PacketID = -1;

	if(!pUser->GetRecvPacket()->Get8Bit(PacketID))
	{
		ServerLog()->Log("ChatProcedure() : Packet ID get Error.");
		return PROCEDURE_ERROR;
	}

	switch((int)PacketID)
	{
	case MSG_CLNT_CHATMSG:
		{
			// 채팅 메시지
			if(!BroadcastMessage(pUser))
				return PROCEDURE_ERROR;
		}
		break;

	case MSG_CLNT_LOGIN:
		{
			return ClientLogin(pUser);
		}
		break;

	case MSG_CLNT_DISCONNECT:
		{
			return PROCEDURE_CLIENTCLOSE;
		}
		break;

	case MSG_CLNT_TOUSERMSG: // 귀속말
		{
			if(!FromToMessage(pUser))
				return PROCEDURE_ERROR;
		}
		break;

	case MSG_CLNT_CREATEUSER:
		{
			if(!CreateUser(pUser))
				return PROCEDURE_ERROR;
			return PROCEDURE_SENDNCLOSE;
		}
		break;

	default:
		{
			// 무엇인지 알 수 없는 패킷을 보내면 연결을 닫는다.
			ServerLog()->Log("Client send bad Packet. Client will Close.");
			return PROCEDURE_ERROR;
		}
		break;
	}
	return PROCEDURE_SUCCESS;
}