int LGameServerMainLogic::ThreadDoing(void* pParam) { while (1) { if (CheckForStop()) { break; } m_GSConToMasterServer.ProcessRecvedPacket(); unsigned int unPacketProcessedOfMasterServer = m_GSConToMasterServer.GetPacketProcessed(); m_GSConToServerNetWork.ProcessRecvedPacket(); unsigned int unPacketProcessedOfGameDBServer = m_GSConToServerNetWork.GetPacketProcessed(); ProcessRecvedPacket(); unsigned int unPacketProcessedOfClientNetWork = GetPacketProcessed(); if (unPacketProcessedOfMasterServer == 0 && unPacketProcessedOfGameDBServer == 0 && unPacketProcessedOfClientNetWork == 0) { struct timespec timeReq; timeReq.tv_sec = 0; timeReq.tv_nsec = 10; nanosleep(&timeReq, NULL); } } return 0; }
int CheckMusicEvent() { DWORD dwResult; dwResult = MsgWaitForMultipleObjects( 1, &g_hDMusicMessageEvent,FALSE, 0, QS_ALLEVENTS ); if(dwResult==WAIT_OBJECT_0){ if(CheckForStop()){ return 1; } } return 0; }
int LConnectorWorkManager::ThreadDoing(void* pParam) { while (1) { t_Connector_Work_Item cwi; memset(&cwi, 0, sizeof(cwi)); E_Circle_Error errorID = m_FixCircleBufForConnectWork.GetOneItem((char*)&cwi, sizeof(cwi)); if (errorID == E_Circle_Buf_Input_Buf_Null || errorID == E_Circle_Buf_Input_Buf_Not_Enough_Len) { return -1; } if (errorID == E_Circle_Buf_No_Error) { LConnectorWorkThread* pcwt = new LConnectorWorkThread; pcwt->SetParams(cwi.szIP, cwi.usPort, m_nUseWhichServerType, m_pss, m_pes, cwi.pExtendData, cwi.usExtDataLen); pcwt->Start(); } else { #ifndef WIN32 struct timespec timeReq; timeReq.tv_sec = 0; timeReq.tv_nsec = 10; nanosleep(&timeReq, NULL); #else Sleep(0); #endif } if (CheckForStop()) { return 0; } } return 0; }
int SelectServerMainLogicThread::ThreadDoing(void* pParam) { time_t tLastPrintTime = 0; while (true) { int nRecvedPacket = 0; for (;;) { t_Recved_Packet tRecvedPacket; if (m_pSelectServer->GetOneRecvedPacket(tRecvedPacket)) { nRecvedPacket++; if (tRecvedPacket.pPacketForRecv == (LPacketSingle*)0xFFFFFFFF) // 连接 上来 { this->OnAddSession(tRecvedPacket.unSessionID); } else if (tRecvedPacket.pPacketForRecv == NULL) // 连接断开 { this->OnSessionDisconnect(tRecvedPacket.unSessionID); } else // 接收到数据包 { // LPacketBroadCast* pBroadCastPacket = m_pSelectServer->AllocOneSendPacket(tRecvedPacket.pPacketForRecv->GetDataLen()); // // if (pBroadCastPacket != NULL) // { // pBroadCastPacket->AddData(tRecvedPacket.pPacketForRecv->GetDataBuf() + sizeof(int), tRecvedPacket.pPacketForRecv->GetDataLen() - sizeof(int)); // // 广播数据包到各个连接 // map<unsigned int, unsigned int>::iterator _ito = m_mapSessionConnected.begin(); // while (_ito != m_mapSessionConnected.end()) // { // m_pSelectServer->AddOneSendPacket(_ito->first, pBroadCastPacket); // _ito++; // } // // 发送出去 // m_pSelectServer->PostAllSendPacket(); // } // 检查接收的数据包是否合法 printf("SessionID:%u,Recved:%s\n", tRecvedPacket.unSessionID, tRecvedPacket.pPacketForRecv->GetDataBuf() + sizeof(int)); } // 释放接收到的数据包到缓冲池 if (tRecvedPacket.pPacketForRecv != NULL && tRecvedPacket.pPacketForRecv != (LPacketSingle*)0xFFFFFFFF) { m_pSelectServer->FreeOneRecvedPacket(tRecvedPacket.pPacketForRecv); } } else { break; } } // 发送数据包 time_t tNow = time(NULL); map<unsigned int, t_Session_Info>::iterator _ito = m_mapSessionConnected.begin(); while (_ito != m_mapSessionConnected.end()) { if (tNow > _ito->second.tLastSendPacketTime + _ito->second.nSendInterval) { int nIndex = rand() % g_globalCount; // 发送一个数据包 LPacketBroadCast* pBroadCastPacket = m_pSelectServer->AllocOneSendPacket(g_narrLen[nIndex]); if (pBroadCastPacket != NULL) { pBroadCastPacket->AddData(pGlobalStatus[nIndex], g_narrLen[nIndex]); printf("Session:%u, Send:%s\n", _ito->first, pGlobalStatus[nIndex]); m_pSelectServer->AddOneSendPacket(_ito->first, pBroadCastPacket); } _ito->second.tLastSendPacketTime = tNow; } _ito++; } m_pSelectServer->PostAllSendPacket(); if (nRecvedPacket == 0) { struct timespec timeReq; timeReq.tv_sec = 0; timeReq.tv_nsec = 10; nanosleep(&timeReq, NULL); } if (CheckForStop()) // 线程停止 { break; } if (tLastPrintTime == 0 || tNow - tLastPrintTime > 5) { printf("Session Connectted Count:%d\n", m_mapSessionConnected.size()); m_pSelectServer->PrintBufStatus(); tLastPrintTime = tNow; } } return 0; }
int LSelectServer::ThreadDoing(void* pParam) { while (1) { unsigned short usProcessedCloseWorkCount = 0; unsigned int unSessionIDForClose = 0; while (GetOneCloseSessionWork(unSessionIDForClose)) { LSelectServerSession* pSession = FindSession(unSessionIDForClose); if (pSession != NULL) { bool bReconnect = pSession->GetReconnect(); pSession->ReleaseAllPacketInSendQueue(); #ifndef WIN32 close(pSession->GetSocket()); #else closesocket(pSession->GetSocket()); #endif RemoveSession(unSessionIDForClose); FreeSession(pSession); AddOneRecvedPacket(unSessionIDForClose, NULL); if (bReconnect) { char szIP[32]; unsigned short usPort = 0; #ifndef WIN32 pthread_mutex_lock(&m_mutexForConnectToServer); #else EnterCriticalSection(&m_mutexForConnectToServer); #endif if (!m_ConnectorWorkManager.AddConnectWork(szIP, usPort, NULL, 0)) { // error print } #ifndef WIN32 pthread_mutex_unlock(&m_mutexForConnectToServer); #else LeaveCriticalSection(&m_mutexForConnectToServer); #endif } } usProcessedCloseWorkCount++; if (usProcessedCloseWorkCount >= 200) { break; } } t_Connector_Work_Result cwr; memset(&cwr, 0, sizeof(cwr)); int nProcessConnecttedWorkCount = 0; while (GetOneConnectedSession(cwr)) { LSelectServerSession* pSession = AllocSession(); if (pSession == NULL) { #ifndef WIN32 close(cwr.nSocket); pthread_mutex_lock(&m_mutexForConnectToServer); #else closesocket(cwr.nSocket); EnterCriticalSection(&m_mutexForConnectToServer); #endif if (!m_ConnectorWorkManager.AddConnectWork(cwr.szIP, cwr.usPort, NULL, 0)) { // error print } #ifndef WIN32 pthread_mutex_unlock(&m_mutexForConnectToServer); #else LeaveCriticalSection(&m_mutexForConnectToServer); #endif nProcessConnecttedWorkCount++; if (nProcessConnecttedWorkCount >= 200) { break; } continue; } else { pSession->SetSocket(cwr.nSocket); if (!AddSession(pSession)) { #ifndef WIN32 close(cwr.nSocket); pthread_mutex_lock(&m_mutexForConnectToServer); #else closesocket(cwr.nSocket); EnterCriticalSection(&m_mutexForConnectToServer); #endif if (!m_ConnectorWorkManager.AddConnectWork(cwr.szIP, cwr.usPort, NULL, 0)) { // error print } #ifndef WIN32 pthread_mutex_unlock(&m_mutexForConnectToServer); #else LeaveCriticalSection(&m_mutexForConnectToServer); #endif FreeSession(pSession); } else { pSession->SetReconnect(true); AddOneRecvedPacket(pSession->GetSessionID(), (LPacketSingle*)0xFFFFFFFF); } } nProcessConnecttedWorkCount++; if (nProcessConnecttedWorkCount >= 200) { break; } } int nWorkCount = CheckForSocketEvent(); if (nWorkCount < 0) { return 0; } int nSendWorkCount = SendData(); if (nWorkCount == 0 && nSendWorkCount == 0) { // sched_yield(); #ifndef WIN32 struct timespec timeReq; timeReq.tv_sec = 0; timeReq.tv_nsec = 10; nanosleep(&timeReq, NULL); #else Sleep(0); #endif } if (CheckForStop()) { return 0; } } return 0; }
int LMainLogicThread::ThreadDoing(void* pParam) { int nSendCount = 0; int nSessionCount = 0; time_t timeToPrintSessionCount = 0; // int nSendPacketTestCount = 0; while(1) { t_Recv_Packet tRecvPacket; bool bGetPacketSuccess = m_pNetWorkServices->GetOneRecvedPacket(&tRecvPacket); if (bGetPacketSuccess == false) { sched_yield(); } else { if (tRecvPacket.pPacket == NULL) // you yi ge lian jie duan kai { // qu diao you xi luo ji guan li de yi ge lian jie nSessionCount--; } else if (tRecvPacket.pPacket == (LPacketSingle*)0xFFFFFFFF) // you yi ge lian jie shang lai { // zeng jia yi ge you xi luo ji guan li de lian jie nSessionCount++; } else // chu li shou dao de shu ju bao { unsigned short usRecvPacketDataLen = tRecvPacket.pPacket->GetDataLen(); // LPacketBroadCast* pPacketForSend = m_pNetWorkServices->RequestOnePacket(usRecvPacketDataLen); // if (pPacketForSend != NULL) // tian chong shu ju, fa song shu ju // { // pPacketForSend->AddData(tRecvPacket.pPacket->GetDataBuf(), tRecvPacket.pPacket->GetDataLen()); // // if (!m_pNetWorkServices->SendPacket(tRecvPacket.u64SessionID, pPacketForSend)) // // { // // char szError[512]; // // sprintf(szError, "LMainLogicThread::ThreadDoing, SendPacket Failed\n"); // // g_ErrorWriter.WriteError(szError, strlen(szError)); // // } // //nSendPacketTestCount++; // //printf("Send Packet:%d\n",nSendPacketTestCount); // nSendCount++; // if (nSendCount >= 30) // { // m_pNetWorkServices->FlushAllPacketToSend(); // nSendCount = 0; // } // } // else // { // char szError[512]; // sprintf(szError, "LMainLogicThread::ThreadDoing, RequestOnePacket Failed\n"); // g_ErrorWriter.WriteError(szError, strlen(szError)); // } // hui shou jie shou de shu ju bao if (!m_pNetWorkServices->FreeRecvedPacket(tRecvPacket.pPacket)) { char szError[512]; sprintf(szError, "LMainLogicThread::ThreadDoing, FreeRecvedPacket Failed\n"); g_ErrorWriter.WriteError(szError, strlen(szError)); // mei you cheng gong tian jia dao dui lie zhong ,na me zhi jie shi fang nei cun delete tRecvPacket.pPacket; } } } if (nSendCount > 0) { m_pNetWorkServices->FlushAllPacketToSend(); nSendCount = 0; } if (CheckForStop()) { break; } // for Test time_t tNow = time(NULL); if (tNow - m_tLastWriteTime > 60) { m_pNetWorkServices->PrintNetWorkServiceBufStatus(&m_RecvStatusWriter, &m_SendStatusWriter); m_tLastWriteTime = tNow; } if (tNow - timeToPrintSessionCount > 10) { printf("SessionCount=%d\n", nSessionCount); timeToPrintSessionCount = tNow; m_pNetWorkServices->PrintRefCountInfoForAll(); } m_pNetWorkServices->KickOutIdleSession(); } return 0; }