📄 gateserver.cpp
字号:
#include "StdInc.h"
#include "Common.h"
#include "Defines.h"
#include "Functions.h"
CGateServer::CGateServer()
{
m_bRunServer = FALSE;
}
CGateServer::~CGateServer()
{
}
BOOL CGateServer::RunServer(SOCKET s, BYTE bySvrID)
{
m_sSocket = s;
m_bConnect = TRUE;
m_nRecvStartPos = m_nRecvEndPos = 0;
m_bRunServer = TRUE;
m_bySvrID = bySvrID;
ResizeSNDBUF(GATE_SOCK_BUF_SIZE);
ResizeRCVBUF(GATE_SOCK_BUF_SIZE);
SetNetEvent();
// Gate肺 Run 茄 第俊 send thread 甫 累悼.. standbyserver 惑怕俊急 send 且 老捞 绝促.
if(InitSendThread() == FALSE) return FALSE;
return TRUE;
}
void CGateServer::OnClose()
{
printf("CGateServer::OnClose() : m_bySvrID = %d\n", m_bySvrID);
if (!m_bRunServer) return;
CloseSendThread();
m_bConnect = FALSE;
m_bRunServer = FALSE;
closesocket(m_sSocket);
}
// Buf俊 default Header啊 甸绢乐澜阑 犬牢饶, 9 byte 掳俊 乐绰 byCmd甫 掘绢可聪促.
BYTE CGateServer::GetHeaderCmdInBuf()
{
return ((BYTE)m_RecvMsgQBuf[m_nRecvStartPos + 8]);
}
BOOL CGateServer::GetMsgHeader(MSG_G2S_HEADER * pMsgHeader)
{
if (GetSizeInBuf() < sizeof(MSG_G2S_HEADER)) return FALSE;
memcpy(pMsgHeader, &(m_RecvMsgQBuf[m_nRecvStartPos]), sizeof(MSG_G2S_HEADER));
return TRUE;
}
BOOL CGateServer::GetMsgHeader(MSG_C2S_HEADER * pMsgHeader)
{
if (GetSizeInBuf() < sizeof(MSG_C2S_HEADER)) return FALSE;
memcpy(pMsgHeader, &(m_RecvMsgQBuf[m_nRecvStartPos]), sizeof(MSG_C2S_HEADER));
return TRUE;
}
BOOL CGateServer::SendMsg(void * pMsg, int nLen)
{
if (m_bRunServer == FALSE) return FALSE;
/*
int Err;
Err = send(m_sSocket, (const char FAR * )pMsg, nLen, 0);
if (Err != SOCKET_ERROR)
{
return TRUE;
}
*/
// Gate甫 烹秦 Client俊 啊绰 皋矫瘤 鞠龋拳!
MSG_DFLT_HEADER * pDfltHeader = (MSG_DFLT_HEADER *)pMsg;
if (pDfltHeader->byCtrl != 0x01)
{
char CryptMsgBuff[2048];
memcpy (CryptMsgBuff, pMsg, nLen);
MsgCrypt.EncryptMsgBody(CryptMsgBuff, nLen);
return (CBaseServer::SendMsg(CryptMsgBuff, nLen));
}
return (CBaseServer::SendMsg(pMsg, nLen));
}
void * CGateServer::PopDecryptMsgQ(int nLen)
{
int nSize;
if ((nSize = GetSizeInBuf()) < nLen)
{
if (m_nRecvEndPos >= PROTECT_MSG_Q_BUF)
{
memcpy(m_RecvMsgQBuf, &(m_RecvMsgQBuf[m_nRecvStartPos]), nSize);
m_nRecvStartPos = 0;
m_nRecvEndPos = nSize;
}
return NULL;
}
void * pMsg = &(m_RecvMsgQBuf[m_nRecvStartPos]);
m_nRecvStartPos += nLen;
if (m_nRecvStartPos == m_nRecvEndPos) m_nRecvStartPos = m_nRecvEndPos = 0;
// Gate 俊辑 坷绰 皋矫瘤 汗龋拳!
MsgCrypt.DecryptMsgBody(pMsg, nLen);
return pMsg;
}
void CGateServer::ParseMsg()
{
char tmpBuffer[8192];
MSG_G2S_HEADER tmpMsgG2SHeader;
MSG_C2S_HEADER tmpMsgC2SHeader;
void * pMsg;
while(GetSizeInBuf() > g_MsgDfltHeaderSize)
{
// 9 byte 掳俊 乐绰 byCmd甫 掘绢可聪促.
switch(GetHeaderCmdInBuf())
{
//------------------------------------------------------------------
// parse Gate to Server msg
//------------------------------------------------------------------
case 0x01 :
{
if (GetMsgHeader(&tmpMsgG2SHeader) == FALSE) return;
switch(tmpMsgG2SHeader.byCmd)
{
case G2S_NEW_CLIENT:
if (( pMsg = PopMsgQ(sizeof(MSG_G2S_NEW_CLIENT)) ) == NULL) return;
//printf("G2S_NEW_CLIENT\n");
Func_G2S_NEW_CLIENT((MSG_G2S_NEW_CLIENT *)pMsg, m_bySvrID);
break;
case G2S_DISCONNECT:
if (( pMsg = PopMsgQ(sizeof(MSG_G2S_DISCONNECT)) ) == NULL) return;
//printf("G2S_DISCONNECT\n");
Func_G2S_DISCONNECT((MSG_G2S_DISCONNECT *)pMsg, m_bySvrID);
break;
default :
//抗寇贸府
//printf("From Gate: Unknown Protocol! %x\n", tmpMsgC2SHeader.byCmd);
if (PopMsgQ(&tmpBuffer, GetSizeInBuf()))
break;
}
break;
}
//------------------------------------------------------------------
// parse Client to Server msg
//------------------------------------------------------------------
//case 0x03:
default :
{
if (GetMsgHeader(&tmpMsgC2SHeader) == FALSE) return;
switch(tmpMsgC2SHeader.wProtocol)
{
case C2S_CHAR_LOGIN:
//printf("C2S_CHAR_LOGIN\n");
if (( pMsg = PopDecryptMsgQ(sizeof(MSG_C2S_CHAR_LOGIN)) ) == NULL) return;
Func_C2S_CHAR_LOGIN((MSG_C2S_CHAR_LOGIN *)pMsg, m_bySvrID);
break;
case C2S_ASK_CREATE_PLAYER:
if (( pMsg = PopDecryptMsgQ(sizeof(MSG_C2S_ASK_CREATE_PLAYER)) ) == NULL) return;
Func_C2S_ASK_CREATE_PLAYER((MSG_C2S_ASK_CREATE_PLAYER *)pMsg, m_bySvrID);
break;
case C2S_ASK_DELETE_PLAYER:
//printf("C2S_ASK_DELETE_PLAYER\n");
if (( pMsg = PopDecryptMsgQ(sizeof(MSG_C2S_ASK_DELETE_PLAYER)) ) == NULL) return;
Func_C2S_ASK_DELETE_PLAYER((MSG_C2S_ASK_DELETE_PLAYER *)pMsg, m_bySvrID);
break;
default :
//抗寇贸府
//printf("From Gate: Unknown Server Protocol! %x %x :%x\n", tmpMsgC2SHeader.byCtrl, tmpMsgC2SHeader.byCmd, tmpMsgC2SHeader.wProtocol);
ZeroMemory(tmpBuffer, sizeof(tmpBuffer));
if (PopMsgQ(&tmpBuffer, GetSizeInBuf()))
{
//printf("=====================\n");
for (int i = 0; i < 40; i++)
{
//printf(" %x ", tmpBuffer[i]);
}
//printf("\n=====================\n");
}
break;
}
break;
}
} // switch()
} // while()
}
BOOL CGateServer::ExceptionHandler(BYTE ErrCode)
{
switch(ErrCode)
{
case SEND_FAILURE:
// 抗寇贸府
break;
case READ_FAILURE:
// 抗寇贸府
break;
default:
// 抗寇贸府
break;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -