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