www.pudn.com > GameGate.rar > ClientSockMsg.cpp


#include "stdafx.h" 
 
DWORD WINAPI	ThreadFuncForMsg(LPVOID lpParameter); 
BOOL			CheckSocketError(LPARAM lParam); 
VOID WINAPI		OnTimerProc(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); 
 
UINT WINAPI		ClientWorkerThread(LPVOID lpParameter); 
 
extern SOCKET					g_csock; 
 
extern HWND						g_hMainWnd; 
extern HWND						g_hStatusBar; 
 
extern CWHDynamicArray	g_UserInfoArray; 
 
 
HANDLE							g_hThreadForComm = NULL; 
HANDLE							g_hSvrMsgEvnt = NULL; 
 
char							g_szRemainBuff[DATA_BUFSIZE * 2]; 
int								g_nRemainBuffLen = 0; 
 
//CWHQueue						g_SendToUserQ; 
 
WSAEVENT						g_ClientIoEvent; 
 
void ProcMakeSocketStr(char *lpMsg) 
{ 
//	_LPTSENDBUFF	lpSendUserData = new _TSENDBUFF; 
	int				nPos = 0; 
 
	_LPTMSGHEADER	lpMsgHeader = (_LPTMSGHEADER)lpMsg; 
 
	CSessionInfo* pSessionInfo = g_UserInfoArray.GetData(lpMsgHeader->wUserGateIndex); 
	 
	if (!pSessionInfo) 
	{ 
#ifdef _DEBUG 
		_RPT0(_CRT_WARN, "Session Not Found\n"); 
#endif 
		 
		return; 
	} 
 
	char *pszData = &pSessionInfo->SendBuffer[pSessionInfo->nSendBufferLen]; 
 
	if (lpMsgHeader->nLength < 0) 
	{ 
//		wsprintf(szPacket, _TEXT("#%s!"), (lpMsg + sizeof(_TMSGHEADER))); // Walk 
		pszData[0]		= '#'; 
		nPos = abs(lpMsgHeader->nLength);//memlen(lpMsg + sizeof(_TMSGHEADER)); 
		memmove(&pszData[1], (lpMsg + sizeof(_TMSGHEADER)), nPos); 
		pszData[++nPos] = '!'; 
		pszData[++nPos] = '\0'; 
 
//		nPos = lstrlen(szPacket); 
//		nPos += 2; 
	} 
	else 
	{ 
		if (lpMsgHeader->nLength >= sizeof(_TDEFAULTMESSAGE)) 
		{ 
			_LPTDEFAULTMESSAGE lpDefMsg = (_LPTDEFAULTMESSAGE)(lpMsg + sizeof(_TMSGHEADER)); 
 
			pszData[0] = '#'; 
 
			if (lpMsgHeader->nLength > sizeof(_TDEFAULTMESSAGE)) 
			{ 
				nPos = fnEncodeMessageA(lpDefMsg, &pszData[1], sizeof(pSessionInfo->SendBuffer) - pSessionInfo->nSendBufferLen - 1); 
//				nPos = fnEncodeMessage((char *)lpDefMsg + sizeof(_TDEFAULTMESSAGE) , &szPacket[nPos + 1], sizeof(szPacket) - nPos - 1); 
				memmove(&pszData[nPos + 1], (lpMsg + sizeof(_TMSGHEADER) + sizeof(_TDEFAULTMESSAGE)), lpMsgHeader->nLength - sizeof(_TDEFAULTMESSAGE)); 
 
				nPos += lpMsgHeader->nLength - sizeof(_TDEFAULTMESSAGE); 
			} 
			else 
			{ 
				nPos = fnEncodeMessageA(lpDefMsg, &pszData[1], sizeof(pSessionInfo->SendBuffer) - pSessionInfo->nSendBufferLen - 1); 
				nPos++; 
			} 
 
			pszData[nPos] = '!'; 
			pszData[++nPos] = '\0'; 
		} 
	} 
 
	pSessionInfo->nSendBufferLen += nPos; 
 
//	lpSendUserData->sock = (SOCKET)lpMsgHeader->nSocket; 
 
//	g_SendToUserQ.PushQ((BYTE *)lpSendUserData); 
 
/*	WSABUF	Buf; 
	DWORD	dwBytesSends; 
 
	Buf.len = nPos; 
	Buf.buf = szPacket; 
 
	WSASend((SOCKET)lpMsgHeader->nSocket, &Buf, 1, &dwBytesSends, 0, NULL, NULL); */ 
} 
 
void ProcReceiveBuffer(char *pszPacket, int nRecv) 
{ 
	int				nLen = nRecv; 
	int				nNext = 0; 
	char			szBuff[DATA_BUFSIZE]; 
	char			*pszData = &szBuff[0]; 
	_LPTMSGHEADER	lpMsgHeader; 
 
	if (g_nRemainBuffLen > 0) 
		memmove(szBuff, g_szRemainBuff, g_nRemainBuffLen); 
 
	memmove(&szBuff[g_nRemainBuffLen], pszPacket, nLen + 1); 
 
	nLen += g_nRemainBuffLen; 
 
	while (nLen >= sizeof(_TMSGHEADER)) 
	{ 
		lpMsgHeader = (_LPTMSGHEADER)pszData; 
 
		if (nLen < (int)(sizeof(_TMSGHEADER) + lpMsgHeader->nLength)) break; 
 
		if (lpMsgHeader->nCode == 0xAA55AA55) 
		{ 
			switch (lpMsgHeader->wIdent) 
			{ 
				case GM_CHECKSERVER: 
					SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(2, 0), (LPARAM)_TEXT("Activation"));	// Received keep alive check code from game server  
					break; 
				case GM_SERVERUSERINDEX: 
				{ 
					CSessionInfo* pSessionInfo = g_UserInfoArray.GetData(lpMsgHeader->wUserGateIndex); 
 
					if (pSessionInfo) 
						pSessionInfo->nServerUserIndex = lpMsgHeader->wUserListIndex; 
 
					break; 
				} 
				case GM_RECEIVE_OK: 
					SendSocketMsgS(GM_RECEIVE_OK, 0, 0, 0, 0, NULL); 
					break; 
				case GM_DATA: 
					ProcMakeSocketStr(pszData); 
					break; 
				case GM_TEST: 
					break; 
			} 
 
			pszData += sizeof(_TMSGHEADER) + abs(lpMsgHeader->nLength); 
			nLen -= sizeof(_TMSGHEADER) + abs(lpMsgHeader->nLength); 
		} 
		else 
		{ 
			pszData++; 
			nLen--; 
		} 
	} // while 
 
	if (nLen > 0) 
	{ 
		memmove(g_szRemainBuff, pszData, nLen); 
		g_nRemainBuffLen = nLen; 
#ifdef _DEBUG 
	_RPT2(_CRT_WARN, "REMAIN:%d, %s\n", g_nRemainBuffLen, pszData); 
#endif 
	} 
	else 
	{ 
		g_nRemainBuffLen = 0; 
	} 
} 
 
/* 
BOOL InitServerThreadForComm() 
{ 
	DWORD	dwThreadIDForComm = 0; 
 
	if (!g_hSvrMsgEvnt) 
		g_hSvrMsgEvnt = CreateEvent(NULL, FALSE, FALSE, NULL); 
 
	if (!g_hThreadForComm) 
	{ 
		g_hThreadForComm	= CreateThread(NULL, 0, ThreadFuncForComm,	NULL, 0, &dwThreadIDForComm); 
 
		if (g_hThreadForComm) 
			return TRUE; 
	} 
 
	return FALSE; 
} 
*/ 
BOOL InitServerThreadForMsg() 
{ 
	DWORD	dwThreadIDForMsg = 0; 
 
	HANDLE hThreadForMsg	= CreateThread(NULL, 0, ThreadFuncForMsg,	NULL, 0, &dwThreadIDForMsg); 
 
	if (hThreadForMsg) 
	{ 
		CloseHandle(hThreadForMsg); 
	 
		return TRUE; 
	} 
 
	return FALSE; 
} 
 
LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam) 
{ 
	switch (WSAGETSELECTEVENT(lParam)) 
	{ 
		case FD_CONNECT: 
		{ 
			if (CheckSocketError(lParam)) 
			{ 
				if (InitServerThreadForMsg()) 
				{ 
					g_nRemainBuffLen = 0; 
 
					KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER); 
					 
					SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 50000, (TIMERPROC)OnTimerProc); 
//					SetTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE, 1000, (TIMERPROC)OnTimerProc); 
 
					InsertLogMsg(IDS_CONNECT_LOGINSERVER); 
					SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Connected")); 
 
					// 
					UINT			dwThreadIDForMsg = 0; 
					unsigned long	hThreadForMsg = 0; 
 
					g_ClientIoEvent = WSACreateEvent(); 
 
					hThreadForMsg = _beginthreadex(NULL, 0, ClientWorkerThread, NULL, 0, &dwThreadIDForMsg); 
				} 
			} 
			else 
			{ 
				closesocket(g_csock); 
				g_csock = INVALID_SOCKET; 
 
				SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc); 
			} 
 
			break; 
		} 
/*		case FD_CLOSE: 
		{ 
			closesocket(g_csock); 
			g_csock = INVALID_SOCKET; 
 
			KillTimer(g_hMainWnd, _ID_TIMER_KEEPALIVE); 
			 
			SetTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER, 10000, (TIMERPROC)OnTimerProc); 
 
			InsertLogMsg(IDS_DISCONNECT_LOGINSERVER); 
			SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(1, 0), (LPARAM)_TEXT("Not Connected")); 
 
			break; 
		} 
		case FD_READ: 
		{ 
			char	szPacket[1024]; 
	 
			int nRecv = recv((SOCKET)wParam, szPacket, sizeof(szPacket), 0); 
 
			szPacket[nRecv] = '\0'; 
 
			ProcReceiveBuffer(szPacket, nRecv); 
 
			break; 
		} 
*/	} 
 
	return 0L; 
} 
 
UINT WINAPI		ClientWorkerThread(LPVOID lpParameter) 
{ 
	_TOVERLAPPEDEX		ClientOverlapped; 
	DWORD				dwIndex; 
	DWORD				dwBytesTransferred; 
	DWORD				dwFlags; 
	DWORD				dwRecvBytes; 
		 
//	char				*pszPos; 
//	int					nSocket; 
 
	ZeroMemory(&ClientOverlapped.Overlapped, sizeof(WSAOVERLAPPED)); 
 
	ClientOverlapped.Overlapped.hEvent = g_ClientIoEvent; 
 
	ClientOverlapped.DataBuf.len	= DATA_BUFSIZE; 
	ClientOverlapped.DataBuf.buf	= &ClientOverlapped.Buffer[0]; 
 
	dwFlags = 0; 
 
	if (WSARecv(g_csock, &(ClientOverlapped.DataBuf), 1, &dwRecvBytes, &dwFlags, &(ClientOverlapped.Overlapped), NULL) == SOCKET_ERROR) 
	{ 
		if (WSAGetLastError() != ERROR_IO_PENDING) 
			return 0;		 
	} 
 
	while (TRUE) 
	{ 
		dwIndex = WSAWaitForMultipleEvents(1, &g_ClientIoEvent, FALSE, WSA_INFINITE, FALSE); 
 
		WSAResetEvent(g_ClientIoEvent); 
 
		WSAGetOverlappedResult(g_csock, &ClientOverlapped.Overlapped, &dwBytesTransferred, FALSE, &dwFlags); 
 
		if (dwBytesTransferred == 0) 
			break; 
 
		ClientOverlapped.DataBuf.buf[dwBytesTransferred] = '\0'; 
 
/*#ifdef _DEBUG 
		_RPT1(_CRT_WARN, "%d:", dwBytesTransferred); 
 
		for (int i = 0; i < dwBytesTransferred; i++) 
			_RPT1(_CRT_WARN, "%c", ClientOverlapped.DataBuf.buf[i]); 
		_RPT0(_CRT_WARN, "\n"); 
#endif*/ 
 
		ProcReceiveBuffer(ClientOverlapped.DataBuf.buf, dwBytesTransferred); 
 
		dwFlags = 0; 
 
		ZeroMemory(&(ClientOverlapped.Overlapped), sizeof(OVERLAPPED)); 
 
		ClientOverlapped.DataBuf.len = DATA_BUFSIZE; 
		ClientOverlapped.DataBuf.buf = &ClientOverlapped.Buffer[0]; 
 
		ClientOverlapped.Overlapped.hEvent = g_ClientIoEvent; 
 
		if (WSARecv(g_csock, &(ClientOverlapped.DataBuf), 1, &dwRecvBytes, &dwFlags, &(ClientOverlapped.Overlapped), NULL) == SOCKET_ERROR) 
		{ 
			if (WSAGetLastError() != ERROR_IO_PENDING) 
				break; 
		} 
	} 
 
	return 0L; 
}