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

📄 serverdlg2.cpp

📁 决战帝王1.5武神降临对喜爱决战的玩家共享研究用
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/////////////////////////////////////////////////////////////////////
//	ServerDlg.cpp : implementation file of the the CServerDlg class
//  Copyright (C) 2000,  Jin-Soo Jeon
//
//	If this code works, it was written by Jin-Soo Jeon.
//	If not, I don't know who wrote it.
//
#include "stdafx.h"
#include "Server.h"
#include "user.h"
#include "ServerDlg.h"
#include "Sresourcearray.h"
#include "SocketManager.h"
#include "Uresourcearray.h"
#include "UserManager.h"
#include "Search.h"
#include "Mcommon.h"
#include "SockDataList.h"
#include <process.h>

DWORD WorkerServerThread(LPVOID lp );
DWORD WorkerUserThread(LPVOID lp );
//DWORD WINAPI WorkerChatThread(LPVOID lp );
//unsigned __stdcall WorkerChatThread( void *lp );
UINT WorkerChatThread( void *lp );

//const int NUMALLOC = 1000;						// Number of times each thread will run
const int NUMSTARTRESOURCES = 5;					// Number of handles to start with
int NUMSTARTRESOURCES_USER = MAX_USER;				// Number of handles to start with

const int MAXPOSSIBLE = 5;							// Maximum number of handles that can be allocated
int MAXPOSSIBLE_USER = MAX_USER;					// Maximum number of handles that can be allocated

const int WAITFORHANDLE = 2000;						// Time a client will wait for a handle

const int HANDLEEXPIRES = 60000*30;					// 30 minutes - time each resource can
//													// live before being considered 'dead'

const int DEADRESOURCEPOLL = 60000*5;				// 5 minutes - time between each garbage
													// collection
const int ALLOCATIONPOLL = MAX_USER;				// ms between each check for whether to
													//   allocate more
const int RESOURCEALLOCSIZE = 1;					// Number of resources to add at a time
const int MINPOOLSIZE = 0;							// Least amount of resources before
/////////////////////////////////////////////////////////////////////////////////
CRITICAL_SECTION m_CS_FileWrite;

// 2002.1.
CRITICAL_SECTION m_CS_LoginData;
CPtrList RecvLoginData;
long nLoginDataCount = 0;
CRITICAL_SECTION m_CS_LogoutData;
CPtrList RecvLogoutData;
long nLogoutDataCount = 0;				

CRITICAL_SECTION m_CS_SqlDataProcess;

CPtrList RecvSqlData;
CRITICAL_SECTION m_CS_SqlData;
long nSqlDataCount = 0;		
int g_ChatEnable[AUTOMATA_THREAD+1];
//
DWORD nRunThreadTimer[AUTOMATA_THREAD+1];

// Fortress Data Packet
// 2002.1.
CRITICAL_SECTION m_CS_FortressData;
CPtrList RecvFortressData;
long nFortressDataCount = 0;

int socket_buffer_size_kiro = 8;

int PacketLength = 512;
long LastDBAccessTime = 0;
long g_TMflag = 0;
long g_TTF[AUTOMATA_THREAD+1];
// chat-data-process thread 
CHATDATAPACKET *g_WaitRecvDataChat[DATA_BUF_SIZE_FOR_THREAD+1][AUTOMATA_THREAD+1];
int g_nChatDataHead[AUTOMATA_THREAD+1];
int g_nChatDataTail[AUTOMATA_THREAD+1];
BYTE g_ServerId = 0;
char ExeFilePath[_MAX_PATH] = {""};

DWORD g_ThreadAliveTime[AUTOMATA_THREAD+1];
DWORD g_ThreadErr[AUTOMATA_THREAD+1];

//

//拘绵 
//CCompressManager jcm;  // 肺弊牢 且版快 单捞磐 拘绵 & 秦力 
// 鞠龋拳 包访
void Make_public_key();
//
char ExePath[_MAX_PATH];
CString m_Gongji_Message;

CSocketManager *g_pSQM = NULL;
CUserManager *g_pUQM = NULL;
CSearch *g_pUserList = NULL;

extern CServerDlg *g_pMainDlg;

long	g_PotionViewOnOff = 0;

BOOL CServerDlg::InitEnv()
{
	int i;
	// 霸烙 辑滚 沥焊 檬扁拳...
	// 角青颇老 版肺 啊廉坷扁...
//	char Buf[_MAX_PATH], Path[_MAX_PATH];
//	char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
//	char IniPath[_MAX_PATH];
//
//	::GetModuleFileName( AfxGetApp()->m_hInstance, Buf, 256 );
//	_splitpath( Buf, drive, dir, fname, ext );
//	strcpy( Path, drive );
//	strcat( Path, dir );		
//	strcpy( ExeFilePath, Path );
//
//	strcpy( IniPath, ExeFilePath );
//	strcat( IniPath, "DB.ini" );
//	
//	// DB-PORT 掘扁...
//	m_nDBPort = GetPrivateProfileInt("DBSERVER", "PORT", 0, IniPath);
//	if(m_nDBPort == 0)
//	{
//		::MessageBox(NULL, "ERROR: LOGIN_SERVER PORT", "函荐 俊矾", MB_OK);
//		return FALSE;
//	}
//
//	// DB-ADDRESS 掘扁...
//	if ( GetPrivateProfileString("DBSERVER", "IPADDRESS", "0", m_DBAddr, sizeof(m_DBAddr), (LPCSTR)IniPath) == 0 )
//	{
//		::MessageBox( NULL, "ERROR: LOGIN_SERVER_ADDRESS", "函荐 俊矾", MB_OK );
//		return FALSE;
//	}
//
//	m_pDBSocket = NULL;
//
//	// JJS	2002.02.28
//	BOOL bIsZoneClient = FALSE;
//	m_pZoneSocket = NULL;
//
//	// Zone Server Address 
//	if (GetPrivateProfileString("ZONE_SERVER", "SERVER_IP", "", m_strZoneAddr, sizeof(m_strZoneAddr), (LPCSTR)IniPath) != 0 )
//	{
//		bIsZoneClient = TRUE;	// Zone Client 肺 悼累
//	}
//	//

	for ( i = 0; i <= AUTOMATA_THREAD; i++ )
	{
		g_TTF[i] = 0;
		g_ChatEnable[i] = TRUE;
		g_nChatDataHead[i] = 0;
		g_nChatDataTail[i] = 0;

		g_ThreadAliveTime[i] = 0;
	}

	for ( i = 0; i < AUTOMATA_THREAD; i++ )
	{
		for ( int j = 0; j <= DATA_BUF_SIZE_FOR_THREAD; j++ )
		{
			g_WaitRecvDataChat[j][i] = NULL;
		}
	}

	// Create Server Socket Quarter Pool...
	g_pSQM = new CSocketManager;

	// SERVER SOCKET INIT...
	CSockResourceArray *pSRA;

	pSRA = new CSockResourceArray(MAXPOSSIBLE);

	// Create Socket Quarter Pool...
	g_pSQM->Init(MAXPOSSIBLE, NUMSTARTRESOURCES, WAITFORHANDLE, HANDLEEXPIRES,
				ALLOCATIONPOLL, MINPOOLSIZE, RESOURCEALLOCSIZE, DEADRESOURCEPOLL,
				pSRA );
	//

	// Socket for Server IOCP Base 檬扁拳...
	m_ServerBase.SetThreadCount(1);
	m_ServerBase.Init( SOCKET_FOR_SERVER, g_pSQM, WorkerServerThread );
	//	

	// Create User Socket Quarter Pool...
	g_pUQM = new CUserManager;

	// SERVER SOCKET INIT...
	CUserResourceArray *pURA;

	pURA = new CUserResourceArray(MAXPOSSIBLE_USER);

	// Create Socket Quarter Pool...
	g_pUQM->Init(MAXPOSSIBLE_USER, NUMSTARTRESOURCES_USER, WAITFORHANDLE, HANDLEEXPIRES,
				ALLOCATIONPOLL, MINPOOLSIZE, RESOURCEALLOCSIZE, DEADRESOURCEPOLL,
				pURA );
	//
	g_pUserList = new CSearch( MAXPOSSIBLE_USER );

	// Pool for UserBase 檬扁拳...   wait 开劝 
	m_UserBase.SetThreadCount(AUTOMATA_THREAD);
	m_UserBase.Init( SOCKET_FOR_USER, g_pUQM, WorkerUserThread );
/*
	///////////////////////////////////////////////////////////////////////////////////////////
	// Login Server Part

	// DB socket 父甸绢 凯扁...
	m_pDBSocket = GetServerSocket( &m_ServerBase );
	if(m_pDBSocket == NULL) 
	{
		::MessageBox(NULL, "ERROR: GetServerSocket", "Error", MB_OK);
		return FALSE;
	}
	m_pDBSocket->m_ReConnectFlag = TRUE;

	if(!DBSocketConnect())
	{
		::MessageBox(NULL, "Login Server 甫 刚历 角青秦 林绞矫夸.", "Error", MB_OK);
		return FALSE;
	}

	// 单捞鸥海捞胶 檬扁 楷搬...
	TCHAR TempBuf[SEND_BUF_SIZE];
	int index = 0;
	SetByte(TempBuf, g_ServerId, index );
	SetByte(TempBuf, DB_SERVER_IN_REQ, index );
	SetByte(TempBuf, (BYTE)0x01, index );
	m_pDBSocket->Send( TempBuf, index );
	//

	///////////////////////////////////////////////////////////////////////////////////////////
	// Zone Server Part

	if(bIsZoneClient)
	{
		m_pZoneSocket = GetServerSocket( &m_ServerBase );
		if(m_pZoneSocket == NULL) 
		{
			::MessageBox(NULL, "ERROR: GetServerSocket, Zone", "Error", MB_OK);
			return FALSE;
		}
		m_pZoneSocket->m_ReConnectFlag = TRUE;
		
		if(!ZoneSocketConnect())
		{
			::MessageBox(NULL, "ERROR: Can't connect to Zone Server.", "Error", MB_OK);
			return FALSE;
		}
	}
	////////////////////////////////////////////////////////////////////////////////////////////
*/
	return TRUE;
}

int CServerDlg::MakeThreadSafeUserMessage( int cmd_code, int wparam, long lparam )
{
	return 0;
}

int CServerDlg::MakeThreadSafeMessage( int cmd_code, int wparam, long lparam )
{
	return 0;
}

void CServerDlg::ServerCloseMessage(int wparam, long lparam) 
{
	MakeThreadSafeMessage( CMD_SERVER_CLOSE, wparam, lparam );
}

void CServerDlg::UserCloseMessage(int wparam, long lparam) 
{
	MakeThreadSafeUserMessage( CMD_USER_CLOSE, wparam, lparam );
}

BOOL CServerDlg::AutoMataAppCmd(WAIT_RECV_DATA *wrd)
{
	int cmd, index = 0;
	memcpy( &cmd, wrd->pData, sizeof(int) );
	index += sizeof(int);

	switch( cmd )
	{
/*
		case CMD_SERVER_CLOSE:
			{
				int sid, lparam;
				CSSocket *p_rSocket, *pSock;

				memcpy( &sid, wrd->pData+index, sizeof(int) );
				index += sizeof(int);

				memcpy( &lparam, wrd->pData+index, sizeof(long) );
				index += sizeof(long);

				p_rSocket = (CSSocket *)lparam;

				delete wrd;

				pSock = (CSSocket *)g_pSQM->m_pResources->GetDataValue( sid );
				if ( pSock && p_rSocket == pSock )
				{
					TRACE("SERVER CLOSED...\n");

					((CBSocket *)pSock)->SockCloseProcess(1);
				}
			}
			
			break;
*/
		case CMD_USER_CLOSE:
			{
				int uid, lparam;
				USER *pUser = NULL;

				memcpy( &uid, wrd->pData+index, sizeof(int) );
				index += sizeof(int);

				memcpy( &lparam, wrd->pData+index, sizeof(long) );
				index += sizeof(long);

				delete wrd;

				pUser = m_Com.GetUserUid( uid );

				if ( pUser )
				{
					pUser->SoftClose();
					//TRACE("AUTOMATA SEND ERROR USER CLOSE = [%d]\n",pUser->m_Uid);
				}
			}
			break;
/*
		case CMD_ROOM_CLOSE:
			{
				int rid, lparam;
				CRoom *pRoom;

				memcpy( &rid, wrd->pData+index, sizeof(int) );
				index += sizeof(int);

				memcpy( &lparam, wrd->pData+index, sizeof(long) );
				index += sizeof(long);

				delete wrd;

				pRoom = (CRoom *)g_pRQM->m_pResources->GetDataValue( rid );

				if ( pRoom )
				{
					pRoom->m_RoomFlag = 0;
					pRoom->ReleaseRoomResource( rid );
					TRACE("ROOM DELETED IN TIMESTAMP FUNCTION[%d]...\n", pRoom->m_RNumber );
				}
			}
			break;
*/
		default:
			delete wrd;
			break;
	}

	return TRUE;
}

LRESULT CServerDlg::OnStartAutomata( WPARAM wparam, LPARAM lparam )
{
	m_UserBase.m_bAcceptEnableFlag = TRUE;

	return 1;
}

/*
DWORD WINAPI WorkerAutomataThread(LPVOID lp )
{
	long *thno;
	int nThreadNo = 0;
	CServerDlg *pMainDlg = g_pMainDlg;

	int proccount = 0;
	DWORD lastTick = GetTickCount();
	thno = (long *)lp;
	nThreadNo = *thno;
	pMainDlg->m_nThreadCount++;

	// 鞠龋拳 包访 
	//BYTE pTBuf[RECEIVE_BUF_SIZE+1];
	//int cryption_flag = 0;
	//DWORD tmp_rec_val; 
	//

	srand( (unsigned)time( NULL ) );
	myrand( 1, 10000 ); myrand( 1, 10000 );

start_loop:;
	if ( pMainDlg->m_nThreadCount < AUTOMATA_THREAD )
	{
		Sleep(1);
		goto start_loop;
	}

	TRACE("Thread Started [%d][%d]...\n", nThreadNo, pMainDlg->m_nThreadCount-1 );

	USER *pSocket;	
	WAIT_RECV_DATA *wrd;

	CPtrList LocalRecvPtrList;
	int nLocalRecvDataLength = 0;

	// 胶饭靛 皋牢 风凭...
	for (;;)
	{
		if ( nRecvDataLength[nThreadNo] < 1 )
		{
			proccount = 0;
			Sleep(1);
			continue;
		}



		EnterCriticalSection( &m_CS_ReceiveData[nThreadNo] );

		while( nRecvDataLength[nThreadNo] >= 1 )
		{
			wrd = (WAIT_RECV_DATA*)RecvPtrList[nThreadNo].RemoveHead();
			nRecvDataLength[nThreadNo] = RecvPtrList[nThreadNo].GetCount();

			LocalRecvPtrList.AddTail( wrd );
		}

		LeaveCriticalSection( &m_CS_ReceiveData[nThreadNo] );

		nLocalRecvDataLength = LocalRecvPtrList.GetCount();

		while( nLocalRecvDataLength >= 1 )
		{
			wrd = (WAIT_RECV_DATA*)LocalRecvPtrList.RemoveHead();
			nLocalRecvDataLength = LocalRecvPtrList.GetCount();

			if( wrd == NULL ) continue;

			if ( wrd->m_Type == SOCKET_FOR_APPLICATION )
			{
				TRACE("USER APPLICATION-CMP CALLED[%d]...\n",wrd->usn);

				//delete wrd;
				pMainDlg->AutoMataAppCmd(wrd);
				Sleep(1);
				continue;
			}
			else if ( wrd->m_Type == SOCKET_FOR_DISCONNECT )
			{
				if ( wrd->usn >= 0 && wrd->usn < 32767 )
				{
					pSocket = (USER *)g_pUQM->m_pResources->GetDataValue( wrd->usn );
				}
				else
				{
					delete wrd;
					Sleep(1);
					continue;
				}

				if ( pSocket == NULL )
				{
					delete wrd;
					Sleep(1);
					continue;
				}

				BYTE len;
				LOGINOUTTHREADDATA *pLIOTD;
				pLIOTD = new LOGINOUTTHREADDATA;
				pLIOTD->UID = wrd->usn;
				len = (BYTE)strlen(pSocket->m_strUserID);
				memcpy(pLIOTD->ID, &len, sizeof(BYTE) );
				memcpy(pLIOTD->ID+sizeof(BYTE), pSocket->m_strUserID, len);
				pLIOTD->ID[sizeof(BYTE)+len] = '\0';

				EnterCriticalSection( &m_CS_LogoutData );
				RecvLogoutData.AddTail(pLIOTD);
				nLogoutDataCount = RecvLogoutData.GetCount();
				LeaveCriticalSection( &m_CS_LogoutData );

				//pSocket->SockCloseProcess();
				
				delete wrd;
				Sleep(1);
				continue;
			}

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

			if ( pSocket == NULL || pSocket->m_Socket == INVALID_SOCKET )
			{
				delete wrd;
				Sleep(1);
				continue;
			}

			// IKING 1999.1.
			if ( pSocket->IsSocketAlive() != TRUE )
			{
				delete wrd;
				wrd = NULL;
				Sleep(1);
				continue;
			}

			pSocket->m_BufCount = 0;
			pSocket->m_BufHead = 0;
			memcpy(pSocket->m_pBuf, wrd->pData, wrd->dcount );
			pSocket->m_BufCount = wrd->dcount;

			delete wrd;
			wrd = NULL;

			// 角力 单捞鸥 贸府...

⌨️ 快捷键说明

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