📄 serverdlg2.cpp
字号:
/////////////////////////////////////////////////////////////////////
// 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 + -