Beispiel #1
0
void CGateInfo::ProcSelectServer(SOCKET s, WORD wServerIndex)
{
    _TDEFAULTMESSAGE	DefMsg;
    char				szEncodePacket[128];
    char				szEncodeAllPacket[256];
    char				szEncodeMsg[24];
    char				*pServerIP;
    GAMESERVERINFO		*pServerInfo;

    PLISTNODE pListNode = xUserInfoList.GetHead();

    while (pListNode)
    {
        CUserInfo *pUserInfo = xUserInfoList.GetData(pListNode);

        if (pUserInfo->sock == s)
        {
            if (!pUserInfo->fSelServerOk)
            {
                fnMakeDefMessageA(&DefMsg, SM_SELECTSERVER_OK, 0, pUserInfo->nCertification, 0, 0);
                int nPos = fnEncodeMessageA(&DefMsg, szEncodeMsg, sizeof(szEncodePacket));
                szEncodeMsg[nPos] = '\0';

                for ( PLISTNODE pNode = g_xGameServerList.GetHead(); pNode; pNode = g_xGameServerList.GetNext( pNode ) )
                {
                    pServerInfo = g_xGameServerList.GetData( pNode );

                    if ( pServerInfo->index == wServerIndex )
                    {
                        pServerIP = pServerInfo->ip;
                        pServerInfo->connCnt++;
                        break;
                    }
                }

                if ( !pServerIP )
                    break;

                pUserInfo->nServerID = wServerIndex;

                int nPos2 = fnEncode6BitBufA((unsigned char *)pServerIP, szEncodePacket, memlen(pServerIP), sizeof(szEncodePacket));
                szEncodePacket[nPos2] = '\0';

                memmove(szEncodeAllPacket, szEncodeMsg, nPos);
                memmove(&szEncodeAllPacket[nPos], szEncodePacket, nPos2);
                szEncodeAllPacket[nPos + nPos2] = '\0';

                SendToGate(s, szEncodeAllPacket);

                pUserInfo->fSelServerOk = TRUE;

                pListNode = xUserInfoList.RemoveNode(pListNode);
            }
        }
        else
            pListNode = xUserInfoList.GetNext(pListNode);
    }
}
Beispiel #2
0
UINT WINAPI LoadAccountRecords(LPVOID lpParameter)
{
	//InsertLogMsg(IDS_LOADACCOUNTRECORDS);


	//下面这一段是获取服务器相关消息的,暂时屏蔽掉
	//CRecordset *pRec = GetDBManager()->CreateRecordset();
	//pRec->Execute( "UPDATE TBL_ACCOUNT SET FLD_CERTIFICATION=0 WHERE FLD_CERTIFICATION >= 30" );
	//GetDBManager()->DestroyRecordset( pRec );
	//// ----------------------------------------------------------------------------------------

	//GAMESERVERINFO *pServerInfo;

	//pRec = GetDBManager()->CreateRecordset();
	//if ( pRec->Execute( "SELECT * FROM TBL_SERVERINFO" ) )
	//{
	//	while ( pRec->Fetch() )
	//	{			
	//		pServerInfo = new GAMESERVERINFO;
	//		if ( !pServerInfo )
	//			break;

	//		pServerInfo->index = atoi( pRec->Get( "FLD_SERVERIDX" ) );
	//		strcpy( pServerInfo->name, pRec->Get( "FLD_SERVERNAME" ) );
	//		strcpy( pServerInfo->ip,   pRec->Get( "FLD_SERVERIP" ) );
	//		pServerInfo->connCnt = 0;

	//		g_xGameServerList.AddNewNode( pServerInfo );
	//	}
	//}
	//GetDBManager()->DestroyRecordset( pRec );

	GAMESERVERINFO *pServerInfo;
	char szTmp[64];
	for ( PLISTNODE pNode = g_xGameServerList.GetHead(); pNode; pNode = g_xGameServerList.GetNext( pNode ) )
	{
		pServerInfo = g_xGameServerList.GetData( pNode );
		
		sprintf( szTmp, "%d,%s,", pServerInfo->index, pServerInfo->name );
		strcat( g_szServerList, szTmp );
	}
	// ----------------------------------------------------------------------------------------

	InitServerThreadForMsg();

	if (InitServerSocket(g_gcSock, &g_gcAddr, _IDM_GATECOMMSOCK_MSG, 5500, 1))
		SwitchMenuItem(TRUE);

	return 0L;
}
Beispiel #3
0
UINT WINAPI LoadAccountRecords(LPVOID lpParameter)
{
	//获取服务器列表的
	GAMESERVERINFO *pServerInfo;
	char szTmp[64];
	for ( PLISTNODE pNode = g_xGameServerList.GetHead(); pNode; pNode = g_xGameServerList.GetNext( pNode ) )
	{
		pServerInfo = g_xGameServerList.GetData( pNode );
		
		sprintf( szTmp, "%d,%s,", pServerInfo->index, pServerInfo->name );
		strcat( g_szServerList, szTmp );
	}
	// ----------------------------------------------------------------------------------------

	//服务器线程
	InitServerThreadForMsg();

	ENGINE_COMPONENT_INFO info = g_SeverConfig.getLoginSrvInfo();

	if (InitServerSocket(g_gcSock, &g_gcAddr, _IDM_GATECOMMSOCK_MSG, info.intport?info.intport:5500, 1))
		SwitchMenuItem(TRUE);

	return 0L;
}
UINT WINAPI ThreadFuncForMsg(LPVOID lpParameter)
{
	_TDEFAULTMESSAGE	DefaultMsg;
	char				*pszBegin, *pszEnd;
	int					nCount;
	PLISTNODE			pListNode;
	CGateInfo*			pGateInfo;

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

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

				if (pGateInfo)
				{
					nCount = pGateInfo->g_SendToGateQ.GetCount();

					if (nCount)
					{
						for (int nLoop = 0; nLoop < nCount; nLoop++)
						{
							_LPTSENDBUFF pSendBuff = (_LPTSENDBUFF)pGateInfo->g_SendToGateQ.PopQ();

							if (pSendBuff)
							{
								int nLen = memlen(pSendBuff->szData);

								if ((pszBegin = (char *)memchr(pSendBuff->szData, '#', nLen)) &&(pszEnd = (char *)memchr(pSendBuff->szData, '!', nLen)))
								{
									*pszEnd = '\0';

									fnDecodeMessageA(&DefaultMsg, (pszBegin + 2));	// 2 = "#?" ? = Check Code 

									switch (DefaultMsg.wIdent)
									{
										case CM_PROTOCOL:
											break;
										case CM_IDPASSWORD:
											pGateInfo->ProcLogin(pSendBuff->sock, pszBegin + DEFBLOCKSIZE + 2);
											break;
										case CM_SELECTSERVER:
											pGateInfo->ProcSelectServer(pSendBuff->sock, DefaultMsg.wParam);
											break;
										case CM_ADDNEWUSER:
											pGateInfo->ProcAddUser(pSendBuff->sock, pszBegin + DEFBLOCKSIZE + 2);
											break;
										case CM_UPDATEUSER:
											break;
										case CM_CHANGEPASSWORD:
											break;
									}
								}

								delete pSendBuff;
								pSendBuff = NULL;
							}
						}
					}
				}

				pListNode = g_xGateList.GetNext(pListNode);
			}
		}

		SleepEx(1, TRUE);	
	}

	return 0;
}
//处理操作
UINT WINAPI ThreadFuncForMsg(LPVOID lpParameter)
{
	_TDEFAULTMESSAGE	DefaultMsg;
	char				*pszBegin, *pszEnd;
	int					nCount;
	PLISTNODE			pListNode;
	CGateInfo*			pGateInfo;

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

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

				if (pGateInfo)
				{
					nCount = pGateInfo->g_SendToGateQ.GetCount();

					if (nCount)
					{
						for (int nLoop = 0; nLoop < nCount; nLoop++)
						{
							_LPTSENDBUFF pSendBuff = (_LPTSENDBUFF)pGateInfo->g_SendToGateQ.PopQ();

							//先解密
							if (pSendBuff)
							{
								int nLen = pSendBuff->nLen;

								pSendBuff->szData[nLen] = '\0';

								pszBegin = pSendBuff->szData;
								{
									//解密
									Packet *pPacket = (Packet*)pSendBuff->szData;
									/*pPacket->dlen = pPacket->crc^ pPacket->dlen;*/

									switch(pPacket->Category)
									{
									case ACCOUNT:
										pGateInfo->AccountProcess(pSendBuff->sock,pPacket);
										break;
									default:
										break;
									}
									//switch (DefaultMsg.wIdent)
									//{
									//	case CM_PROTOCOL:
									//		break;
									//	case CM_IDPASSWORD:
									//		pGateInfo->ProcLogin(pSendBuff->sock, pszBegin + DEFBLOCKSIZE + 2);
									//		break;
									//	case CM_SELECTSERVER:
									//		pGateInfo->ProcSelectServer(pSendBuff->sock, DefaultMsg.wParam);
									//		break;
									//	case CM_ADDNEWUSER:
									//		pGateInfo->ProcAddUser(pSendBuff->sock, pszBegin + DEFBLOCKSIZE + 2);
									//		break;
									//	case CM_UPDATEUSER:
									//		break;
									//	case CM_CHANGEPASSWORD:
									//		break;
									//}
								}

								delete pSendBuff;
								pSendBuff = NULL;
							}
						}
					}
				}

				pListNode = g_xGateList.GetNext(pListNode);
			}
		}

		SleepEx(1, TRUE);	
	}

	return 0;
}
Beispiel #6
0
void CGateInfo::GetSelectCharacter(SOCKET s, char *pszPacket)
{
	char				szDecodeMsg[128];
	char				szServerIP[32];
	char				szEncodeMsg[32];
	char				szEncodeData[64];
	char				szEncodePacket[256];
	_TDEFAULTMESSAGE	DefaultMsg;
	
	// ORZ: Load Balancing, 접속수가 가장 적은 게이트 서버 IP 선택
	GAMESERVERINFO *pBestServer = NULL;
	GAMESERVERINFO *pTemp;

//	EnterCriticalSection( &g_xGameServerList.m_cs );
	for ( PLISTNODE pNode = g_xGameServerList.GetHead();pNode; pNode = g_xGameServerList.GetNext( pNode ) )
	{
		pTemp = g_xGameServerList.GetData( pNode );
		
		if ( !pBestServer || pTemp->connCnt < pBestServer->connCnt )
		{
			pBestServer = pTemp;
			continue;
		}
	}

	pBestServer->connCnt++;
//	LeaveCriticalSection( &g_xGameServerList.m_cs );

	strcpy( szServerIP, pBestServer->ip );
	// ORZ: from here

	int nPos = fnDecode6BitBufA(pszPacket, szDecodeMsg, sizeof(szDecodeMsg));
	szDecodeMsg[nPos] = '\0';

	char *pszDevide = (char *)memchr(szDecodeMsg, '/', nPos);
	
	if (pszDevide)
	{
		*pszDevide++ = '\0';

		// 서버 선택이 가능하도록 수정
		_TLOADHUMAN		tLoadHuman;
		CServerInfo*	pServerInfo;

		memcpy(tLoadHuman.szUserID, szDecodeMsg, memlen(szDecodeMsg));
		memcpy(tLoadHuman.szCharName, pszDevide, memlen(pszDevide));
		ZeroMemory(tLoadHuman.szUserAddr, sizeof(tLoadHuman.szUserAddr));
		tLoadHuman.nCertification = 0;

		PLISTNODE pListNode = g_xServerList.GetHead();

		if (pListNode)
			pServerInfo = g_xServerList.GetData(pListNode);

		GetLoadHumanRcd(pServerInfo, &tLoadHuman, 0);

		fnMakeDefMessageA(&DefaultMsg, SM_STARTPLAY, 0, 0, 0, 0);
		nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
		int nPos2 = fnEncode6BitBufA((unsigned char *)szServerIP, szEncodeData, memlen(szServerIP) -1, sizeof(szEncodeData));
		
		memmove(szEncodePacket, szEncodeMsg, nPos);
		memmove(&szEncodePacket[nPos], szEncodeData, nPos2);
		szEncodePacket[nPos + nPos2] = '\0';
		
		// ORZ: 전체 리스트에 추가한다.
		// 같은 아이디가 이미 존재하거나 메모리 부족등의 이유로 실패할 수 있다.
//		if ( GetGlobalUserList()->Insert( tLoadHuman.szCharName, szServerIP ) )
			SendToGate(s, szEncodePacket);
//		else
//		{
//			fnMakeDefMessageA(&DefaultMsg, SM_STARTFAIL, 0, 0, 0, 0);
//			nPos = fnEncodeMessageA(&DefaultMsg, szEncodeMsg, sizeof(szEncodeMsg));
//			szEncodeMsg[nPos] = '\0';
			
//			SendToGate(pGateInfo->sock, s, szEncodeMsg);
//		}
	}
}