⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverdlg2.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						}
						else if(pUser->m_curz == 1) //老馆 鞘靛搁 老窜 焊辰促
						{
							pUser->SendSystemMsg((LPTSTR)(LPCTSTR)strMsg, SYSTEM_ANNOUNCE, TO_ME);
						}
					}
				}
			}
/*
//			EnterCriticalSection(&m_CS_SqlDataProcess);
			switch(pSDP->code)
			{
				default:
					break;
			};
//			LeaveCriticalSection(&m_CS_SqlDataProcess);
*/
			delete pSDP;
			Sleep(1);
		}
	}

	return 0;
}

void CServerDlg::InitThreads()
{
	//DWORD nid;
	//unsigned int nid;

	// AUTOMATA THREAD...
	for ( int i = 0; i < AUTOMATA_THREAD; i++ )
		m_ThreadNo[i] = i;

	// 肺弊牢 胶饭靛 积己...
	//m_hLoginThread = ::CreateThread( NULL, 0, WorkerLoginThread, (LPVOID)this, 0, &nid);
	//m_hLoginThread = (HANDLE)_beginthreadex( NULL, 0, &WorkerLoginThread, (LPVOID)this, 0, &nid);
	m_hLoginThread = AfxBeginThread( WorkerLoginThread, (LPVOID)this );

	// 肺弊酒眶  胶饭靛 积己...
	//m_hLogoutThread = ::CreateThread( NULL, 0, WorkerLogoutThread, (LPVOID)this, 0, &nid);
	//m_hLogoutThread = (HANDLE)_beginthreadex( NULL, 0, &WorkerLogoutThread, (LPVOID)this, 0, &nid);
	m_hLogoutThread = AfxBeginThread( WorkerLogoutThread, (LPVOID)this );

	// SQL 巩 贸府 胶饭靛...
	//m_hSqlThread = (HANDLE)_beginthreadex( NULL, 0, &WorkerSQLThread, (LPVOID)this, 0, &nid);
	m_hSqlThread = AfxBeginThread( WorkerSQLThread, (LPVOID)this );

	m_hFortressThread = AfxBeginThread( WorkerFortressThread, (LPVOID)this );

	// 盲泼 胶饭靛 积己...
	for ( i = 0; i < AUTOMATA_THREAD; i++ )
	{
		//m_ctThread[i] = ::CreateThread( NULL, 0, WorkerChatThread, (LPVOID)&m_ThreadNo[i], CREATE_SUSPENDED, &nid );
		//m_ctThread[i] = (HANDLE)_beginthreadex( NULL, 0, &WorkerChatThread, (LPVOID)&m_ThreadNo[i], CREATE_SUSPENDED, &nid );
		m_ctThread[i] = AfxBeginThread( WorkerChatThread, (LPVOID)&m_ThreadNo[i] );

		//::SetThreadPriority( m_amThread[i], THREAD_PRIORITY_ABOVE_NORMAL );
	}

	//for ( i = 0; i < AUTOMATA_THREAD; i++ )
	//{
	//	ResumeThread( m_ctThread[i]  );
	//}
}

void CServerDlg::UserFree(int uid)
{
	USER *pUser = NULL;

	pUser = g_pUserList->GetUserUid(uid);
	if ( pUser )
	{
		g_pUserList->FreeUser( uid );
		m_CurUserCount--;
	}
}

/*
void CServerDlg::SetAliveSignalFill()
{


	long curtick = GetTickCount();

	for ( int i = 0; i < MAX_USER; i++ )
	{
		pUser = m_Com.GetUserUid(i);

		if ( pUser && pUser->m_SockFlag == 1 )
		{
			// 矫埃 胶牌橇 盎脚窍扁...
			long useruid = pUser->m_Sid;
			g_pUQM->m_pResources->SetTimeStamp( useruid, curtick );
		}
	}
}
*/

void CServerDlg::SetAliveSignalFill()
{
	long curtick = GetTickCount();

	for ( int i = 0; i < MAX_USER; i++ )
	{
		if ( g_pUQM->m_pResources->IsFree( i ) == true )
			continue;

		if ( g_pUserList->GetUserUid(i) == NULL )
		{
			g_pUQM->m_pResources->SetFree( i );
			g_pUQM->AddResource(i);
			continue;
		}

		USER *pUser = (USER*)g_pUQM->m_pResources->GetDataValue( i );
		if ( pUser && pUser->m_state != STATE_GAMESTARTED )
		{
			if ( pUser->m_ConnectionSuccessTick == 0 ) continue;
			if ( curtick - pUser->m_ConnectionSuccessTick > 30 * 60 * 1000 )
				pUser->SoftClose();
		}
	}

}

//DWORD WINAPI WorkerChatThread(LPVOID lp )
//unsigned __stdcall WorkerChatThread( void *lp )
UINT WorkerChatThread( void *lp )
{
	long *thno;
	int nThreadNo = 0;
	CServerDlg *pMainDlg = g_pMainDlg;
	thno = (long *)lp;
	nThreadNo = *thno;

	TRACE("ChatThread Started [%d]...\n", nThreadNo );

	CPtrList LocalRecvPtrList;
	int nLocalRecvDataLength = 0;
	int tail;
	CHATDATAPACKET *pCDP;

	// 胶饭靛 皋牢 风凭...
	for (;;)
	{
		if (g_nChatDataHead[nThreadNo] == g_nChatDataTail[nThreadNo] )
		{
			Sleep(1);
			continue;
		}
		tail = g_nChatDataTail[nThreadNo];

		pCDP = g_WaitRecvDataChat[tail][nThreadNo];
		if ( pCDP == NULL )
		{
			tail++;
			tail %= DATA_BUF_SIZE_FOR_THREAD;
			g_nChatDataTail[nThreadNo] = tail;
			continue;
		}

		USER *pUser = NULL;
		pUser = g_pUserList->GetUserUid(pCDP->UID);
		if ( pUser == NULL )
		{
			g_WaitRecvDataChat[tail][nThreadNo] = NULL;

			delete pCDP;

			tail++;
			tail %= DATA_BUF_SIZE_FOR_THREAD;
			g_nChatDataTail[nThreadNo] = tail;
			continue;
		}

		if ( pUser->m_SockFlag == 1 )
		{
			switch(pCDP->code)
			{
			case CHAT_REQ:
				pUser->ChatReqWithLength((char *)pCDP->pData, pCDP->dcount);// >ChatReq((char *)pCDP->pData);
				break;
			}
		}

		delete pCDP;
		g_WaitRecvDataChat[tail][nThreadNo] = NULL;

		tail++;
		tail %= DATA_BUF_SIZE_FOR_THREAD;
		g_nChatDataTail[nThreadNo] = tail;
	}

	return 0;
}

CSSocket* CServerDlg::GetServerSocket( CIOCPBASE *pIocpBase )
{
	const RHANDLE* pHandle = 0;
	CSSocket *pSocket;
	int sid;

	pHandle = 0; sid = -1;

	DWORD ret = g_pSQM->GetFreeResource(&pHandle);
	if ( ret == 0 )
	{
		sid = pHandle->pos;
		pSocket = (CSSocket *)pHandle->handle;
	}		
	else
	{
		return NULL;
	}

	pSocket->m_pIocpBase = pIocpBase;
	pSocket->m_Sid = sid;
	pSocket->m_SNumber = sid;
	pSocket->m_State = STATE_ACCEPTED;
	pSocket->m_RecvOverlap.hEvent = NULL;
	pSocket->m_SendOverlap.hEvent = NULL;

	return pSocket;
}

BOOL CServerDlg::DBSocketConnect()
{
	if ( m_pDBSocket == NULL )
	{
		m_pDBSocket = GetServerSocket( &m_ServerBase );
		m_pDBSocket->m_ReConnectFlag = TRUE;
	}

	if ( !m_pDBSocket->m_ReConnectFlag )
	{
		return FALSE;
	}

	if ( !m_pDBSocket->Create() )
	{
		m_pDBSocket->SoftClose();
		return FALSE; 
	}

	if ( !m_pDBSocket->Connect(m_DBAddr, m_nDBPort) )
	{
		m_pDBSocket->SoftClose();
		return FALSE;
	}

	m_pDBSocket->Init();
	m_pDBSocket->m_ReConnectFlag = FALSE;
	m_pDBSocket->m_Type = SOCKET_FOR_DBSERVER;

	return TRUE;
}

////////////////////////////////////////////////////////////////////////////////////////
// JJS
BOOL CServerDlg::ZoneSocketConnect()
{
	if ( m_pBridgeSocket == NULL )
	{
		m_pBridgeSocket = GetServerSocket( &m_ServerBase );
		m_pBridgeSocket->m_ReConnectFlag = TRUE;
	}

	if ( !m_pBridgeSocket->m_ReConnectFlag )
	{
		return FALSE;
	}

	if ( !m_pBridgeSocket->Create() )
	{
		m_pBridgeSocket->SoftClose();
		return FALSE; 
	}

	if ( !m_pBridgeSocket->Connect(m_strZoneAddr, USER_SOCKET_PORT) )
	{
		m_pBridgeSocket->SoftClose();
		return FALSE;
	}

	m_pBridgeSocket->Init();
	m_pBridgeSocket->m_ReConnectFlag = FALSE;
	m_pBridgeSocket->m_Type = SOCKET_FOR_SERVER;

	return TRUE;
}

void CServerDlg::DBAccountLoginResult(char *pBuf, int index, int length )
{
	int uid;

	uid = GetShort(pBuf,index);
	if ( uid < 0 || uid >= MAX_USER )
		return;

	USER *pUser = m_Com.GetUserUid( uid );
	if ( pUser == NULL ) return;

	pUser->DBAccountLoginResult( pBuf, index, length );

}

void CServerDlg::DBGameStartResult( char *pBuf, int index, int length )
{
	int uid;
	char szID[CHAR_NAME_LENGTH+1];
	char pTempBuf[RECEIVE_BUF_SIZE+1];

	uid = GetShort(pBuf,index);
	if ( uid < 0 || uid >= MAX_USER )
		return;

	USER *pUser = m_Com.GetUserUid( uid );
	if ( pUser == NULL ) return;

	memset( szID, NULL, sizeof(szID) );

	int comp_data_len;
	int org_data_len, extracted_data_count;
	DWORD crc_value, cm_crc_value;
	char *pcaket_data_buffer, *extract_buf_ptr;

	// 单捞鸥 拘绵钱扁 矫累...
	pUser->m_CompMng.FlushAddData();

	// 拘绵等 单捞鸥辨捞掘扁...
	comp_data_len = GetShort( pBuf, index );

	// 盔贰单捞鸥辨捞掘扁...
	org_data_len = GetShort( pBuf, index );

	// CRC蔼 掘扁...
	crc_value = GetDWORD( pBuf, index );

	// 拘绵 单捞鸥 掘扁...
	GetString( pTempBuf, pBuf, comp_data_len, index );

	// 拘绵 钱扁... 
	pUser->m_CompMng.PreUncompressWork( comp_data_len, org_data_len );

	pcaket_data_buffer = pUser->m_CompMng.GetCompressionBufferPtr();
	memcpy( pcaket_data_buffer , pTempBuf, comp_data_len ); 

	// 钱扁...
	if ( pUser->m_CompMng.Extract() == false )
	{
		pUser->m_CompMng.FlushExtractedData();
		// 抗扁摹 给茄 俊矾...
		pUser->SoftClose();
		return;
	}

	// 俊矾 盲农...
	if ( pUser->m_CompMng.ErrorOccurred != 0 )
	{
		pUser->m_CompMng.FlushExtractedData();
		// 抗扁摹 给茄 俊矾...
		pUser->SoftClose();
		return; 
	}

	cm_crc_value = pUser->m_CompMng.GetCrcValue();
	if ( crc_value != cm_crc_value )
	{
		pUser->m_CompMng.FlushExtractedData();
		// 抗扁摹 给茄 俊矾...
		pUser->SoftClose();
		return;
	}

	extracted_data_count = pUser->m_CompMng.GetExtractedDataCount();
	if ( org_data_len != extracted_data_count )
	{
		pUser->m_CompMng.FlushExtractedData();
		// 抗扁摹 给茄 俊矾...
		pUser->SoftClose();
		return;
	}
	//
	extract_buf_ptr = pUser->m_CompMng.GetExtractedBufferPtr();
	memcpy( pTempBuf, extract_buf_ptr, extracted_data_count );

	// 荤侩 场. 滚欺 檬扁拳...
	pUser->m_CompMng.FlushExtractedData();

	int uc_index = 0;
	GetString( szID, pTempBuf, CHAR_NAME_LENGTH, uc_index );
	if (strcmp( szID, pUser->m_strUserID ) != 0 )
	{
		// 抗扁摹 给茄 俊矾...
		pUser->SoftClose();
		return; 
	}

	pUser->DBGameStartResult( pTempBuf, uc_index, length );

}

void CServerDlg::DBjobPhasor( CSSocket* pServerSock, char *pTBuf, int length )
{
	char pBuf[RECEIVE_BUF_SIZE+1];

	memcpy( pBuf, pTBuf, length );

	int index = 0;
	BYTE byte = pBuf[index++];

	switch ( byte )
	{
	case DB_SERVER_IN_RES:
		{
			short serverid;
			serverid = GetShort(pBuf, index);
		}
		break;

	case ACCOUNT_LOGIN_RESULT:
		DBAccountLoginResult(pBuf, index, length );
		break;

	case GAME_START_RESULT:
		DBGameStartResult(pBuf, index, length );
		break;
	};	
}

void CServerDlg::Send2DBsvr( TCHAR *pBuf, int length )
{
	if ( m_pDBSocket )
		m_pDBSocket->Send( pBuf, length );
}

//-----------------------------------------------------------------------------
// CALLBACK FUNCTION...
//
DWORD WorkerServerThread(LPVOID lp )
{
	WAIT_RECV_DATA *wrd = (WAIT_RECV_DATA *)lp;
	CSSocket *pSocket;

	if ( wrd == NULL ) return 0;

	// IKING 2000.1.
	// 郴何 橇肺弊伐 皋矫瘤 贸府...
	if ( wrd->m_Type == SOCKET_FOR_APPLICATION )
	{
		TRACE("USER APPLICATION-CMP CALLED[%d]...\n",wrd->usn);

		g_pMainDlg->AutoMataAppCmd(wrd);

		return 1;
	}
	//

	if ( wrd->usn >= 0 && wrd->usn < 32767 )
	{
		pSocket = (CSSocket *)g_pSQM->m_pResources->GetDataValue( wrd->usn );
	}
	else
		return 0;

	if ( pSocket == NULL || pSocket->m_Socket == INVALID_SOCKET )
	{
		return 0;
	}

	// IKING 1999.1.
	if ( pSocket->IsSocketAlive() != TRUE )
	{
		return 0;
	}

	((CSSocket *)pSocket)->AutomataServer( (char *)wrd->pData, wrd->dcount );

	return 1;
}

DWORD WorkerUserThread(LPVOID lp )
{
	WAIT_RECV_DATA *wrd = (WAIT_RECV_DATA *)lp;
	USER *pSocket;

	if ( wrd == NULL ) return 0;

	// IKING 2000.1.
	// 郴何 橇肺弊伐 皋矫瘤 贸府...
	if ( wrd->m_Type == SOCKET_FOR_APPLICATION )
	{
		TRACE("USER APPLICATION-CMP CALLED[%d]...\n",wrd->usn);

		g_pMainDlg->AutoMataAppCmd(wrd);

		return 1;
	}
	//

	if ( wrd->usn >= 0 && wrd->usn < 32767 )
	{
		pSocket = (USER *)g_pUQM->m_pResources->GetDataValue( wrd->usn );
	}
	else
		return 0;

	if ( pSocket == NULL || pSocket->m_Socket == INVALID_SOCKET )
	{
		return 0;
	}

	// IKING 1999.1.
	if ( pSocket->IsSocketAlive() != TRUE )
	{
		return 0;
	}

	g_ThreadAliveTime[pSocket->m_iModSid] = GetTickCount();

	pSocket->ProcessData((char *)wrd->pData, wrd->dcount);

	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -