📄 mapserversocket.cpp
字号:
ErrorMsg(TEXT("IOCP create error.. code = %d\n"),GetLastError());
return FALSE;
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// Network Module Initialize
////////////////////////////////////////////////////////////////////////////////////////
BOOL MapServerSocket::InitializeNetwork(LPSTR pAddress, UINT pPort)
{
// --------------------------------------------------------------------------------
// Listen Socket Create
// --------------------------------------------------------------------------------
m_SocketListen = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP,
NULL, 0, WSA_FLAG_OVERLAPPED);
if( m_SocketListen == INVALID_SOCKET )
{
ErrorMsg(TEXT("WSASocket error. Error code = %d"),WSAGetLastError());
return FALSE;
}
INT nRet = 0;
SOCKADDR_IN si_addr;
// --------------------------------------------------------------------------------
// IP Address & Port且寸
// --------------------------------------------------------------------------------
si_addr.sin_family = AF_INET;
si_addr.sin_addr.s_addr = inet_addr( pAddress );
si_addr.sin_port = htons(pPort);
int reuse = 1;
nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_REUSEADDR, (char FAR *)&reuse, sizeof(int));
if (nRet == SOCKET_ERROR)
{
ErrorMsg( "(X) Reuse addr error" );
}
nRet = bind(m_SocketListen, (struct sockaddr *) &si_addr, sizeof(si_addr));
if(nRet == SOCKET_ERROR)
{
ErrorMsg(TEXT("Error bind. Error code = %d"),WSAGetLastError());
return FALSE;
}
nRet = listen(m_SocketListen, SOMAXCONN );
if(nRet == SOCKET_ERROR)
{
ErrorMsg(TEXT("Error listen. Error code = %d"),WSAGetLastError());
return FALSE;
}
// --------------------------------------------------------------------------------
// disable send buffering on listen socket.
// --------------------------------------------------------------------------------
int nZero = 0;
LINGER LingerStruct;
nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_SNDBUF, (char*) &nZero, sizeof(nZero));
if(nRet == SOCKET_ERROR)
{
ErrorMsg("ListenSock Option(SO_SNDBUF) Failed: %d\n", WSAGetLastError());
return FALSE;
}
// --------------------------------------------------------------------------------
// disable recv buffering on listen socket.
// --------------------------------------------------------------------------------
nZero = 0;
nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_RCVBUF, (char*) &nZero, sizeof(nZero));
if(nRet == SOCKET_ERROR)
{
ErrorMsg("ListenSock Option(SO_RCVBUF) Failed: %d\n", WSAGetLastError());
return FALSE;
}
// --------------------------------------------------------------------------------
// set linger on listen socket(for hard closing).
// --------------------------------------------------------------------------------
LingerStruct.l_onoff = 1;
LingerStruct.l_linger = 0;
nRet = setsockopt(m_SocketListen, SOL_SOCKET, SO_LINGER, (char*) &LingerStruct, sizeof(LingerStruct));
if(nRet == SOCKET_ERROR)
{
ErrorMsg("ListenSock Option(SO_LINGER) Failed: %d\n", WSAGetLastError());
return FALSE;
}
#ifdef DEF_SECURITYPACKET
srand( (unsigned)time( NULL ) );
int iSeed = rand() + 1;
memset(m_sSeed,0x0,40 ) ;
memset(m_sSeedKey,0x0,20 ) ;
itoa(iSeed,m_sSeed,10 ) ;
itoa(iSeed,m_sSeedKey,10 ) ;
_17Init(iSeed) ;
CRegCrypt crypt;
m_iSeedLength = strlen(m_sSeedKey) ;
crypt.Encrypt(m_sSeedKey,m_iSeedLength) ;
BYTE *pEncryptString;
DWORD nEncryptLength;
gCrypt().EncryptText
(
m_sSeedKey , // EncrpiptSeed
(BYTE *) m_sSeed , // 鞠龋拳等 Seed
strlen(m_sSeed) , // 鞠龋拳等
pEncryptString ,
nEncryptLength
);
memcpy(m_sSeed, pEncryptString, nEncryptLength);
m_iSeedLength = nEncryptLength ;
#endif
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// NPC甫 积己 矫糯
//
// - 包访 风凭阑 MAP栏肺 捞傈 矫糯
////////////////////////////////////////////////////////////////////////////////////////
//DEL bool MapServerSocket::InitializeNPC()
//DEL {
//DEL
//DEL for ( LIST_VOIDPTR::iterator it = g_pMap->m_LocationNPC.Begin(); it != g_pMap->m_LocationNPC.End(); it++)
//DEL {
//DEL _NPC_ *pNPC = (_NPC_ *)*it;
//DEL
//DEL if( !pNPC ) continue;
//DEL
//DEL NPC *lpNpc = new NPC( pNPC );
//DEL }
//DEL
//DEL return true;
//DEL }
////////////////////////////////////////////////////////////////////////////////////////
// Thread Inistialize
//
// - IOCP Work Thread
// - Accept Work Thread
// - Read Work Thread
// - Send Work Thread
////////////////////////////////////////////////////////////////////////////////////////
BOOL MapServerSocket::InitializeThread()
{
// --------------------------------------------------------------------------------
// IOCP Work Thread
// Thread 积己 箭磊俊 林狼窃
// --------------------------------------------------------------------------------
unsigned dwThreadID = 0;
SYSTEM_INFO systemInfo;
GetSystemInfo(&systemInfo);
// --------------------------------------------------------------------------------
// NOTENOTE: 静饭靛狼 箭磊啊 腹篮芭 鞍酒辑 临看促.
//
// --------------------------------------------------------------------------------
m_dwThreadCount = systemInfo.dwNumberOfProcessors ;
HANDLE hHandle = NULL;
for (DWORD i = 0; i < m_dwThreadCount ; i++)
{
hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_Iocp,
this, 0, (unsigned int *)&dwThreadID );
SetThreadPriority( hHandle, THREAD_PRIORITY_ABOVE_NORMAL );
if (hHandle == NULL) return false ;
CloseHandle(hHandle) ;
}
// --------------------------------------------------------------------------------
// Accept Work Thread
// --------------------------------------------------------------------------------
hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_Accept,
this, 0, (unsigned int *)&dwThreadID );
if (hHandle == NULL) return false ;
CloseHandle(hHandle) ;
// --------------------------------------------------------------------------------
// IO Read CompletedThread Thread
// --------------------------------------------------------------------------------
hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_IOReadCompleted,
this, 0, (unsigned int *)&dwThreadID );
if (hHandle == NULL) return false ;
CloseHandle(hHandle) ;
// --------------------------------------------------------------------------------
// Work Tick
// --------------------------------------------------------------------------------
hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) Thread_WorkTick,
this, 0, (unsigned int *)&dwThreadID );
if (hHandle == NULL) return false ;
CloseHandle(hHandle) ;
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// IO俊 荤侩瞪 CONTEXT甫 馆券 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
_LPPER_IO_CONTEXT MapServerSocket::CreateIOContext( _IO_TYPE io )
{
_LPPER_IO_CONTEXT lpIOContext = NULL;
if(io == WRITE)
{
// --------------------------------------------------------------------------------
// 漂沥 箭磊捞惑 IO荤侩矫 辑滚 DWON矫糯
// --------------------------------------------------------------------------------
#ifndef _DEBUG
if( m_pSendIOPool->GetNumInUse() > MAX_SIOCOUNT*10 - 1000 )
{
static DWORD dwServerShutdown1 = 0 ;
// 促款登绰芭搁 肺弊甫 巢变促.
if(dwServerShutdown1 == 0)
{
MapLog("(X) Send IO POOL Full (%d)Server Shoutdown ", _Module.m_nMapSeq ) ;
}
if (timeGetTime() - dwServerShutdown1 > 3*1000 )
{
ErrorMsg( "(X) Send IO POOL Full Server Shoutdown");
_Module.Handler( SERVICE_CONTROL_STOP );
dwServerShutdown1 = timeGetTime() ;
}
}
#endif
lpIOContext = m_pSendIOPool->Alloc();
}
else
{
// --------------------------------------------------------------------------------
// 漂沥 箭磊捞惑 IO荤侩矫 辑滚 DWON矫糯
// --------------------------------------------------------------------------------
#ifndef _DEBUG
if( m_pRecvIOPool->GetNumInUse() > MAX_IO_CONTEXT - 500 )
{
static DWORD dwServerShutdown2 = 0 ;
// 促款登绰芭搁 肺弊甫 巢变促.
if(dwServerShutdown2 == 0)
{
MapLog("(X) Recv IO POOL Full (%d) Server Shoutdown ", _Module.m_nMapSeq ) ;
}
if (timeGetTime() - dwServerShutdown2 > 3*1000 )
{
ErrorMsg( "(X) Recv IO POOL Full Server Shoutdown");
_Module.Handler( SERVICE_CONTROL_STOP );
dwServerShutdown2 = timeGetTime() ;
}
}
#endif
lpIOContext = m_pRecvIOPool->Alloc();
}
if( lpIOContext )
{
memset( &(lpIOContext->ov) , 0 , sizeof(WSAOVERLAPPED));
lpIOContext->io = io;
lpIOContext->dwTransBytes = 0;
lpIOContext->dwTotalBytes = 0;
lpIOContext->lpSocketContext = NULL;
lpIOContext->buf[0] = 0;
if (lpIOContext->bIsUse == true)
{
ErrorMsg("(X) m_pIOPool->Alloc() error (%d) !",lpIOContext);
}
else
{
lpIOContext->bIsUse = true;
}
// 2003.08.31 Duke Kim眠啊 - Error Checking
lpIOContext->dwMagicNum = MAGIC_NUM;
lpIOContext->nType = MAPSOCKET_TYPE ;
}
else
{
ErrorMsg("(X) alloc error in CreateIOContext \n");
}
return lpIOContext;
}
////////////////////////////////////////////////////////////////////////////////////////
// IO苞访 Packet阑 积己 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
_LPSOCKET_FD MapServerSocket::CreateSocketContext()
{
_LPSOCKET_FD lpSocketFD = (_LPSOCKET_FD)g_pMap->Pool_Socket_Pop();
if(lpSocketFD)
{
lpSocketFD->socket = INVALID_SOCKET;
lpSocketFD->nIO = 0;
lpSocketFD->nSeq = 0;
lpSocketFD->bShutdown = false ;
if( lpSocketFD->nSendIO > 0 )
{
ErrorMsg( "(X) Pop : Map Server Send IO=%d", lpSocketFD->nSendIO );
}
lpSocketFD->nSendIO = 0;
}
else
{
ErrorMsg("(X) Alloc error in CreateSkt Context");
}
return lpSocketFD;
}
////////////////////////////////////////////////////////////////////////////////////////
// IO Memory甫 馆券矫糯
//
// - Error Checking风凭阑 八配 饶 昏力 矫糯
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::ReleaseIOContext( _LPPER_IO_CONTEXT lpIOContext )
{
// --------------------------------------------------------------------------------
// Error Checking ...
// --------------------------------------------------------------------------------
if( !lpIOContext )
{
ErrorMsg( "(X) Map : Release IO Contest IS NULL" );
return;
}
if( lpIOContext->dwMagicNum != MAGIC_NUM )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -