void ConsoleProfiler::onTimer1000() { ServerSocket* logicServer = GameServer::getInstance()->getLogicServer(); ServerSocket* consoleServer = GameServer::getInstance()->getConsoleServer(); DBQueue* dbQueue = GameServer::getInstance()->getDBQueue(); ByteArray packet; MessageHead head; head.command = CMD_CONSOLE_SUBSCRIBE; head.pack(packet); ConsoleSubscribeMessage msg; msg.memoryPeak = Profiler::getPeakRSS(); msg.memoryUsed = Profiler::getCurrentRSS(); msg.numDBRequests = dbQueue->getQueueLength(); msg.numOnline = logicServer->numOnlines(); #ifdef _WIN32 msg.ioDataPoolSize = logicServer->getIODataPoolSize(); msg.ioDataPostedSize = logicServer->getIODataPostedSize(); #endif msg.pack(packet); head.packSize = packet.getSize(); packet.position = 0; head.pack(packet); auto iter = allSubscribe.begin(); while (iter != allSubscribe.end()) { long long clientID = *iter; auto client = consoleServer->getClient(clientID); if (!client) { iter = allSubscribe.erase(iter); } else { client->send(packet); client->flush(); ++iter; } } }
//thread for receiving data from client unsigned int ServerSocket::IOCPRecvThread(LPVOID lpParam) { ServerSocket* pServer = (ServerSocket*)lpParam; BOOL bRet; DWORD dwByteCountBak=0; OVERLAPPED_PLUS* ov = NULL; OP_CODE opCode = OP_NORMAL; ServerSocketClient* pClient = NULL; stOpParam* pParam = NULL; bool bWriteFlag = false, bConnectSuccess = false; while(1) { bRet = GetQueuedCompletionStatus(pServer->m_completionPort, &dwByteCountBak, (ULONG_PTR*)(&opCode), (LPOVERLAPPED*)&ov, INFINITE); //关闭线程 if(opCode == OP_QUIT) break; //有些操作需要先获取客户端 if(opCode != OP_ADDCLIENT && opCode != OP_MAINTENANCE && opCode != OP_TIMETRACE) { if(ov != NULL) { pClient = pServer->getClient(ov->ClientId); if(!pClient) { free(ov); continue; } } else continue; } //出错处理 if(bRet == FALSE) { printWSAError("GetQueuedCompletionStatus() failed"); //pClient->onNetFail( 出错处理 continue; } //这个之后再写吧…… if(opCode == OP_TIMETRACE) { } //设置客户端连接类型 else if(opCode == OP_SETCONNECTTYPE) { pParam = (stOpParam*)ov->WsaBuf.buf; pClient->setConnectType(pParam->val); } else if(opCode == OP_ADDCLIENT) pServer->addClient(ADD_CLIENT_NUM); //else if(opCode == OP_MAINTENANCE) // //pServer->OP_MAINTENANCE(); //维护所有客户端 //else if(opCode == OP_SEND) // //pClient->sendPacket((OVERLAPPED_PLUS*)ov) //发送数据处理 else if(opCode == OP_RESTART) { free(ov); //pClient->restart(); //客户端重新连接 } else if(opCode == OP_NORMAL) { if(dwByteCountBak == 0) { printWSAError("dwByteCountBak == 0, is error"); //pClient->onNetFail( 出错处理 continue; } bWriteFlag = ov->bCtxWrite; if(bWriteFlag) { //pClient->handleSend() 发送处理 } else { bConnectSuccess = true; if(pClient->getState() == ServerSocketClient::SSF_ACCEPTING) bConnectSuccess = pClient->handleConnect(ov, dwByteCountBak); if (bConnectSuccess) pClient->onReceive(ov->WsaBuf.buf, dwByteCountBak); } } else { printf("无效opCode=%d", opCode); } // 为下一个重叠调用建立单I/O操作数据 ZeroMemory(&(ov->overlapped), sizeof(OVERLAPPED)); // 清空内存 ov->WsaBuf.len = m_maxPacketSize; ov->WsaBuf.buf = ov->buffer; WSARecv(ServerSocketClient->m_socket, &(ov->WsaBuf), 1, &dwByteCountBak, &Flags, &(ov->overlapped), NULL); } return 0; }