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; }
LPARAM OnClientSockMsg(WPARAM wParam, LPARAM lParam) { switch (WSAGETSELECTEVENT(lParam)) { case FD_CONNECT: { if (CheckSocketError(lParam)) { InsertLogMsg(IDS_CONNECT_DBSERVER); KillTimer(g_hMainWnd, _ID_TIMER_CONNECTSERVER); UINT dwThreadIDForMsg = 0; unsigned long hThreadForMsg = 0; // SetTimer(g_hMainWnd, _ID_TIMER_PROCESSUSERHUMAN, 1, (TIMERPROC)OnProcessUserHuman); if (hThreadForMsg = _beginthreadex(NULL, 0, ProcessLogin, NULL, 0, &dwThreadIDForMsg)) { // SetThreadPriority((HANDLE)hThreadForMsg, THREAD_PRIORITY_HIGHEST); hThreadForMsg = _beginthreadex(NULL, 0, ProcessUserHuman, NULL, 0, &dwThreadIDForMsg); hThreadForMsg = _beginthreadex(NULL, 0, ProcessMonster, NULL, 0, &dwThreadIDForMsg); hThreadForMsg = _beginthreadex(NULL, 0, ProcessNPC, NULL, 0, &dwThreadIDForMsg); } int nPort; if (!jRegGetKey(_GAME_SERVER_REGISTRY, _TEXT("LocalPort"), (LPBYTE)&nPort)) nPort = 5000; InitServerSocket(g_ssock, &g_saddr, _IDM_SERVERSOCK_MSG, nPort, 1); InsertLogMsg(IDS_STARTSERVICE); SendMessage(g_hStatusBar, SB_SETTEXT, MAKEWORD(0, 0), (LPARAM)_T("Ready")); } 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; InsertLogMsg(IDS_DISCONNECT_DBSERVER); break; } case FD_READ: { char szPacket[8096]; int nRecv = recv((SOCKET)wParam, szPacket, sizeof(szPacket), 0); #ifdef _DEBUG _RPT1(_CRT_WARN, "ClientSockMsg[FD_READ]:%d\n", nRecv); #endif szPacket[nRecv] = '\0'; ProcReceiveBuffer(szPacket, nRecv); break; } } return 0L; }