示例#1
0
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;
}
示例#3
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;
}