📄 mapserversocket.cpp
字号:
ErrorMsg( "(X) Map : Release IO Contest MEMORY ERROR " );
return;
}
if( false == lpIOContext->bIsUse )
{
ErrorMsg( "(X) Map : Release IO Context NOT USE %d",lpIOContext );
return;
}
_IO_TYPE io = lpIOContext->io ;
if( io == WRITE && lpIOContext->lpSocketContext )
{
_LPSOCKET_FD pSocketFD = (_LPSOCKET_FD)lpIOContext->lpSocketContext;
::InterlockedDecrement( (long *) &pSocketFD->nSendIO ) ;
}
// --------------------------------------------------------------------------------
// IO CONTEXT甫 檬扁拳矫糯
// --------------------------------------------------------------------------------
lpIOContext->bIsUse = false;
memset( &lpIOContext->ov , 0, sizeof(WSAOVERLAPPED));
lpIOContext->io = READ;
lpIOContext->dwTransBytes = 0;
lpIOContext->dwTotalBytes = 0;
lpIOContext->lpSocketContext = NULL;
lpIOContext->buf[0] = 0;
// --------------------------------------------------------------------------------
// MAX老嫐 包访 IO龋免 咯何 犬牢
// --------------------------------------------------------------------------------
if (io == WRITE)
{
// #ifndef _DEBUG
// if( m_pSendIOPool->GetCount() > MAX_SIOCOUNT - 1000 )
// {
// ErrorMsg( "(X) Send ReleaseIOContext %d", m_pSendIOPool->GetCount() );
// }
// #endif
m_pSendIOPool->Free( lpIOContext );
}
else
{
// #ifndef _DEBUG
// if( m_pRecvIOPool->GetCount() > MAX_RIOCOUNT - 1000 )
// {
// ErrorMsg( "(X) Recv ReleaseIOContext %d", m_pRecvIOPool->GetCount() );
// }
// #endif
m_pRecvIOPool->Free( lpIOContext );
}
lpIOContext = NULL ;
}
////////////////////////////////////////////////////////////////////////////////////////
// 荤侩等 Socket Pool阑 馆券 矫糯
//
// - lpSocketFD = NULL捞 悼累
// - CONNECT_CLOSE老锭绰 Socket阑 Memory俊 历厘 矫糯
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::ReleaseSocketContext( _LPSOCKET_FD lpSocketFD )
{
if( !lpSocketFD ) return;
if( lpSocketFD->bClose ) return;
lpSocketFD->nSeq = 0;
lpSocketFD->nIO = 0;
lpSocketFD->bClose = true ;
lpSocketFD->bShutdown = false;
if( lpSocketFD->PlayerStatus == CONNECT_LOGIN )
{
ErrorMsg( "(X) Release Socket Error CONNECT LOGIN = %s/%s", lpSocketFD->pPlayer->m_strAccountID, lpSocketFD->pPlayer->m_strPlayerID );
}
if( lpSocketFD->PlayerStatus == CONNECT_START )
{
ErrorMsg( "(X) Release Socket Error CONNECT_START = %s/%s", lpSocketFD->pPlayer->m_strAccountID, lpSocketFD->pPlayer->m_strPlayerID );
}
// if( lpSocketFD->nSendIO > 0 )
// {
// ErrorMsg( "(X) Push : Map Server Send IO=%d", lpSocketFD->nSendIO );
// }
CLOSESOCKET( lpSocketFD->socket );
// --------------------------------------------------------------------------------
// Client立加 LIST俊辑 力芭 矫糯
// --------------------------------------------------------------------------------
m_listConnection.RemovePtr( lpSocketFD );
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
if(m_listHackingConnection.Find(lpSocketFD) != NULL)
m_listHackingConnection.RemovePtr(lpSocketFD);
#endif
// --------------------------------------------------------------------------------
// Socket Memory甫 馆券 矫糯
// --------------------------------------------------------------------------------
if( g_pMap )
{
g_pMap->Pool_Socket_Push( lpSocketFD );
#if defined(_DEBUG) || defined(DEF_BUGTRACE)
// ----------------------------------------------------------------------------
// 立加 Client肮荐 免仿
// ----------------------------------------------------------------------------
CString strMessage;
strMessage.Format("%d / %d",m_listConnection.GetCount(), g_pMap->Count_Player() );
MessageCount( strMessage );
#endif
}
}
////////////////////////////////////////////////////////////////////////////////////////
// WORK IOCP
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::WorkIocp()
{
BOOL bSuccess;
DWORD dwBytesTransferred;
LPOVERLAPPED lpOverlapped;
_LPPER_IO_CONTEXT lpMapIOContext;
_LPSOCKET_FD lpMapSocketContext;
_LPPER_BULK_IO_CONTEXT lpDBIOContext;
_LPDBSOCKET_FD lpDBSocketContext;
void * lpSocketContext ;
_LPWSACORE lpWSACore ;
// --------------------------------------------------------------------------------
// IOCP Loop
// --------------------------------------------------------------------------------
while( g_hIOCP )
{
bSuccess = GetQueuedCompletionStatus
(
g_hIOCP ,
&dwBytesTransferred ,
(LPDWORD)&lpSocketContext ,
(LPOVERLAPPED *)&lpOverlapped ,
INFINITE
);
// ----------------------------------------------------------------------------
// 橇肺弊伐捞 辆丰 等 版快
// ----------------------------------------------------------------------------
if( !_Module.m_bService )
break;
if ( lpSocketContext == NULL)
{
continue ;
}
lpWSACore = CONTAINING_RECORD( lpOverlapped, WSACORE , ov );
if(lpWSACore->nType == DBSOCKET_TYPE )
{
lpDBIOContext = CONTAINING_RECORD( lpOverlapped, _PER_BULK_IO_CONTEXT, ov );
lpDBSocketContext = (_LPDBSOCKET_FD) lpSocketContext ;
}
else
{
lpMapIOContext = CONTAINING_RECORD( lpOverlapped, _PER_IO_CONTEXT, ov );
lpMapSocketContext = (_LPSOCKET_FD) lpSocketContext ;
}
if(!bSuccess || (bSuccess && (0 == dwBytesTransferred)))
{
if(lpWSACore->nType == DBSOCKET_TYPE )
{
g_lpDBSock->ReConnect( lpDBSocketContext , lpDBIOContext ) ;
continue;
}
else
{
CloseClient( lpMapSocketContext , lpMapIOContext );
continue;
}
}
// ----------------------------------------------------------------------------
// 捞锅 IO 肯丰饶 傈价 / 荐脚茄 bytes荐甫 歹窍绊,
// 钮俊 持绊 肯丰等 IO啊 乐澜阑 舅覆.
// ----------------------------------------------------------------------------
lpWSACore->lpSocketContext = lpSocketContext;
lpWSACore->dwTransBytes += dwBytesTransferred;
// ----------------------------------------------------------------------------
// IO俊 蝶扼辑 盒府 矫糯
// READ/WRITE QUEUE蝶肺 备盒 矫糯
// ----------------------------------------------------------------------------
if(lpWSACore->nType == DBSOCKET_TYPE )
{
switch( lpDBIOContext->io )
{
case READ :
{
g_lpDBSock->m_listReadCompleted.AddTail( lpDBIOContext );
SetEvent( g_lpDBSock->m_hReadEventCompleted );
}
break;
case WRITE :
{
g_lpDBSock->WriteCompleted(lpDBIOContext);
}
break;
default : break;
}
}
else
{
switch( lpMapIOContext->io )
{
case READ :
{
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
//Jason 2004-08-19-china
//菩哦阑 罐篮 泅犁 Tick Count甫 咯扁辑 历厘茄促. ReadPacket()俊辑 历厘窍搁
//菩哦捞 府矫宏 钮俊辑 掘绢柯 矫痢阑 扁废 窍霸 登骨肺...
InterlockedExchange((LPLONG)&(lpMapIOContext->dwCurrentSpeedTick), timeGetTime());
#endif
m_listReadCompleted.AddTail( lpMapIOContext );
SetEvent( m_hReadEventCompleted );
}
break;
case WRITE :
{
WriteCompleted(lpMapIOContext);
}
break;
default : break;
}
}
}
// --------------------------------------------------------------------------------
// IOCP Loop捞 厚沥惑 辆丰矫
// --------------------------------------------------------------------------------
if( _Module.m_bService ) ErrorMsg("(X) IOCP Work Thread Terminate ..");
}
////////////////////////////////////////////////////////////////////////////////////////
// Client 立加 ACCEPT 贸府
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::WorkAccept()
{
int ret = 0;
int clientAddrLen = 0;
DWORD dwNumberOfBytesRecvd = 0;
DWORD dwFlags = 0;
SOCKET SocketCleintFD = INVALID_SOCKET;
_LPPER_IO_CONTEXT lpIOContext = NULL;
_LPSOCKET_FD lpSocketFD = NULL;
struct sockaddr_in clientAddr;
WSABUF wsaBuf;
clientAddrLen = sizeof(clientAddr);
while( _Module.m_bService )
{
// ----------------------------------------------------------------------------
// 风橇郴 檬扁拳
// ----------------------------------------------------------------------------
ret = 0;
dwNumberOfBytesRecvd = 0;
dwFlags = 0;
SocketCleintFD = INVALID_SOCKET;
memset( &clientAddr , 0, sizeof(struct sockaddr_in));
wsaBuf.buf = NULL;
wsaBuf.len = 0;
lpIOContext = NULL;
lpSocketFD = NULL;
// ----------------------------------------------------------------------------
// Accept
// ----------------------------------------------------------------------------
SocketCleintFD = WSAAccept
(
m_SocketListen ,
(struct sockaddr *)&clientAddr ,
&clientAddrLen ,
NULL ,
0
);
if( !_Module.m_bService ) break; // 橇肺弊伐狼 辆丰
// ----------------------------------------------------------------------------
// 荤侩磊啊 呈公 腹篮 版快 促弗 辑滚肺 立加阑 蜡档窃
// ----------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY
if( m_listConnection.GetCount() >= (_Module.m_dwMaxUser -5) )
#else
if( m_listConnection.GetCount() >= (MAX_SOCKET_CONTEXT -5) )
#endif
{
CLOSESOCKET( SocketCleintFD );
ErrorMsg( "(X) Max Connection Full" );
continue;
}
if( SocketCleintFD == INVALID_SOCKET )
{
ErrorMsg("(X) Error WSAAccept, Error code = %d",WSAGetLastError() );
break;
}
lpSocketFD = CreateSocketContext();
if( !lpSocketFD )
{
ErrorMsg("(X) Error memory allocate 1");
break;
}
// ----------------------------------------------------------------------------
// Default 2矫埃 饶 Connection Close啊 牢瘤凳
// ----------------------------------------------------------------------------
DWORD tmp;
tcp_keepalive keepAlive = { TRUE, 10000, 1000 };
WSAIoctl( lpSocketFD->socket, SIO_KEEPALIVE_VALS, &keepAlive, sizeof( keepAlive ), 0, 0, &tmp, NULL, NULL );
lpIOContext = CreateIOContext(READ);
if( !lpIOContext )
{
ErrorMsg("(X) Error memory allocate 2");
break;
}
g_hIOCP = CreateIoCompletionPort
(
(HANDLE)SocketCleintFD ,
g_hIOCP ,
(DWORD)lpSocketFD ,
0
);
if( !g_hIOCP )
{
ErrorMsg( "(X) WorkAccept : Error CreateIoCompletionPort, Error code = %d\n",GetLastError() );
break;
}
// ----------------------------------------------------------------------------
// 秦寸 Player狼 扁夯 沥焊甫 Setting矫糯
//
// - Socket FD积己
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -