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;
}
Exemple #2
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;
}