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; }
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; }