⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gatecommsockmsg.cpp

📁 真正的传奇源代码
💻 CPP
字号:
#include "stdafx.h"

extern HWND								g_hStatusBar;

extern SOCKET							g_gcSock;

UINT WINAPI ThreadFuncForMsg(LPVOID lpParameter);

extern HANDLE							g_hIOCP;
extern BOOL								g_fTerminated;

CWHList<CGateInfo*>						g_xGateList;
CWHList<GAMESERVERINFO*>				g_xGameServerList;
CWHList<GATESERVERINFO*>				g_xGateServerList;
char									g_szServerList[1024];

unsigned long							g_hThreadForMsg = 0;

void UpdateStatusBar(BOOL fGrow)
{
	static long	nNumOfCurrSession = 0;

	TCHAR	szText[20];

	(fGrow ? InterlockedIncrement(&nNumOfCurrSession) : InterlockedDecrement(&nNumOfCurrSession));
	
	wsprintf(szText, _TEXT("%d Sessions"), nNumOfCurrSession);

	SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(3, 0), (LPARAM)szText);
}

BOOL InitServerThreadForMsg()
{
	UINT	dwThreadIDForMsg = 0;

	if (!g_hThreadForMsg)
	{
		g_hThreadForMsg	= _beginthreadex(NULL, 0, ThreadFuncForMsg,	NULL, 0, &dwThreadIDForMsg);

		if (g_hThreadForMsg)
			return TRUE;
	}

	return FALSE;
}

DWORD WINAPI AcceptThread(LPVOID lpParameter)
{
	int					nLen = sizeof(SOCKADDR_IN);

	SOCKET				Accept;
	SOCKADDR_IN			Address;

	while (TRUE)
	{
		Accept = accept(g_gcSock, (struct sockaddr FAR *)&Address, &nLen);

		if (g_fTerminated)
			return 0;

		CGateInfo* pGateInfo = new CGateInfo;

		if (pGateInfo)
		{
			pGateInfo->sock = Accept;

			CreateIoCompletionPort((HANDLE)pGateInfo->sock, g_hIOCP, (DWORD)pGateInfo, 0);

			if (g_xGateList.AddNewNode(pGateInfo))
			{
				int zero = 0;
				
				setsockopt(pGateInfo->sock, SOL_SOCKET, SO_SNDBUF, (char *)&zero, sizeof(zero) );

				pGateInfo->Recv();

				UpdateStatusBar(TRUE);

#ifdef _DEBUG
				TCHAR szGateIP[256];
				wsprintf(szGateIP, _T("%d.%d.%d.%d"), Address.sin_addr.s_net, Address.sin_addr.s_host, 
															Address.sin_addr.s_lh, Address.sin_addr.s_impno);

				InsertLogMsgParam(IDS_ACCEPT_GATESERVER, szGateIP);
#endif
			}
		}
	}

	return 0;
}

void CloseGate(CGateInfo* pGateInfo)
{
}

DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
{
	DWORD					dwBytesTransferred = 0;
	CGateInfo*				pGateInfo = NULL;
	LPOVERLAPPED			lpOverlapped = NULL;
	char					szTmp[DATA_BUFSIZE];

	while (TRUE)
	{
		if ( GetQueuedCompletionStatus(
									(HANDLE)CompletionPortID, 
									&dwBytesTransferred, 
									(LPDWORD)&pGateInfo, 
									(LPOVERLAPPED *)&lpOverlapped, 
									INFINITE) == 0 )
		{
			return 0;
		}

		if (g_fTerminated)
		{
			PLISTNODE		pListNode;

			if (g_xGateList.GetCount())
			{
				pListNode = g_xGateList.GetHead();

				while (pListNode)
				{
					pGateInfo = g_xGateList.GetData(pListNode);

					if (pGateInfo)
						pGateInfo->Close();

					delete pGateInfo;
					pGateInfo = NULL;

					pListNode = g_xGateList.RemoveNode(pListNode);
				}
			}

			return 0;
		}
		
		if ( dwBytesTransferred == 0 )
		{
			pGateInfo->Close();
			continue;
		}

		pGateInfo->bufLen += dwBytesTransferred;

		while ( pGateInfo->HasCompletionPacket() )
		{
			*(pGateInfo->ExtractPacket( szTmp ) - 1) = '\0';

			switch ( szTmp[1] )
			{
				case '-':
					pGateInfo->SendKeepAlivePacket();
					break;
				case 'A':
					pGateInfo->ReceiveSendUser(&szTmp[2]);
					break;
				case 'O':
					pGateInfo->ReceiveOpenUser(&szTmp[2]);
					break;
				case 'X':
					pGateInfo->ReceiveCloseUser(&szTmp[2]);
					break;
				case 'S':
					pGateInfo->ReceiveServerMsg(&szTmp[2]);
					break;
				case 'M':
					pGateInfo->MakeNewUser(&szTmp[2]);
					break;
			}
		}

		if ( pGateInfo->Recv() == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
		{
			InsertLogMsg(_TEXT("WSARecv() failed"));
			continue;
		}
	}

	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -