📄 dbsocket.cpp
字号:
GetSystemInfo(&systemInfo);
// m_dwThreadCount = systemInfo.dwNumberOfProcessors * 2;
m_dwThreadCount = MAX_DBSOCKET_WORKER_THREAD;
HANDLE hHandle = NULL ;
//
// IO Read CompletedThread Thread
//
hHandle = (HANDLE) _beginthreadex( NULL, 0, (unsigned(__stdcall*)(void*)) WorldServer_IOReadCompletedThread,
this, 0, (unsigned int *)&dwThreadID );
if (hHandle == NULL) return false ;
CloseHandle(hHandle) ;
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// World Server俊 单捞鸥 傈价
//
// - 傈价 PACKET阑 罐酒辑 MAIN Connection俊 单捞鸥 傈价
// - SERVER MODE牢 版快
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bSend(_LPDBPACKET lpDbPacket )
{
//
// World Server客 DISCONNECT惑怕牢 版快 QUEUE俊 历厘
//
if( _Module.m_ServerStatus == SERVER_DISCONNECTWORLD)
{
// m_RecoveryList.AddTail( lpDbPacket );
g_pServerMem->WorldPacket_Push( lpDbPacket );
return false;
}
_LPPER_BULK_IO_CONTEXT lpSendIOContext = NULL;
lpSendIOContext = CreateIOContext(WRITE);
// --------------------------------------------------------------------------------
// NOTENOTE: 菩哦 鞠龋拳
// --------------------------------------------------------------------------------
lpDbPacket->dwSeq = 1 ;
lpDbPacket->wCheckSum = PacketEncrypt(lpDbPacket->strPacket, lpDbPacket->dwSize, lpDbPacket->dwSeq&31) ;
lpDbPacket->dwSize += DBPACKETHEADER_SIZE;
#ifdef DEF_KUMA_CHECK_PACKET
if ( lpDbPacket->dwSize >= MAX_BULKBUF_SIZE )
{
char cMsg[200] ;
wsprintf(cMsg,"(X) bSend Error SIZE(%d) CMD(%d) CS(%d)",lpDbPacket->dwSize,lpDbPacket->dwCommand,lpDbPacket->wCheckSum) ;
ErrorMsg( cMsg );
g_pServerMem->WorldPacket_Push( lpDbPacket );
return false;
}
#endif
if( lpSendIOContext )
{
memcpy( lpSendIOContext->buf , lpDbPacket, lpDbPacket->dwSize );
lpSendIOContext->dwTotalBytes = lpDbPacket->dwSize ;
lpSendIOContext->lpSocketContext = m_SocketFD[ m_nNowSocketNum ];
WriteCompleted( lpSendIOContext) ;
}
else
{
int x = 1;
}
g_pServerMem->WorldPacket_Push( lpDbPacket );
return true ;
}
////////////////////////////////////////////////////////////////////////////////////////
// World Server俊 单捞鸥 傈价
//
// - 傈价 PACKET阑 罐酒辑 漂沥 Connection俊 单捞鸥 傈价
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bSend(_LPDBPACKET lpDbPacket, int pNum )
{
_LPPER_BULK_IO_CONTEXT lpSendIOContext = NULL;
lpSendIOContext = CreateIOContext(WRITE);
TRACE("(O) 2 (%d) [%s]\n",lpDbPacket->dwCommand, lpDbPacket->strPacket);
// --------------------------------------------------------------------------------
// NOTENOTE: 菩哦 鞠龋拳
// --------------------------------------------------------------------------------
lpDbPacket->dwSeq = 1 ;
lpDbPacket->wCheckSum = PacketEncrypt(lpDbPacket->strPacket, lpDbPacket->dwSize, lpDbPacket->dwSeq&31) ;
lpDbPacket->dwSize += DBPACKETHEADER_SIZE;
if( lpSendIOContext )
{
memcpy( lpSendIOContext->buf , lpDbPacket, lpDbPacket->dwSize );
lpSendIOContext->dwTotalBytes = lpDbPacket->dwSize ;
lpSendIOContext->lpSocketContext = m_SocketFD[ pNum ]; // 漂沥 Connection俊 傈价
WriteCompleted( lpSendIOContext) ;
}
g_pServerMem->WorldPacket_Push( lpDbPacket );
return true ;
}
////////////////////////////////////////////////////////////////////////////////////////
// World Server Connect 风凭
//
// - RECONNECT矫 MEMORY眉农
// - 促矫 立加 矫档 矫 -> Send俊 角菩茄 沥焊甫 啊瘤绊 乐澜
////////////////////////////////////////////////////////////////////////////////////////
bool DBSocket::bConnect( int pNum, bool pReconnect )
{
//
// Listen Socket Create
//
m_Socket[pNum] = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);
if( m_Socket[pNum] == INVALID_SOCKET )
{
ErrorMsg( "WSASocket error. Error code = %d",WSAGetLastError() );
m_bSocketStatus[ pNum ] = false;
return false;
}
INT nRet = 0;
SOCKADDR_IN si_addr;
// 家南阑 稠喉废欧 葛靛肺
u_long arg;
arg = 1;
ioctlsocket(m_Socket[pNum], FIONBIO, &arg);
//
// IP Address & Port且寸
//
si_addr.sin_family = AF_INET;
si_addr.sin_addr.s_addr = inet_addr( _Module.m_szWorldIP );
si_addr.sin_port = htons( _Module.m_nWorldPORT );
nRet = connect(m_Socket[pNum], (struct sockaddr *) &si_addr, sizeof(si_addr));
if (nRet == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
nRet = WSAGetLastError();
m_bSocketStatus[ pNum ] = false;
return FALSE;
}
}
DWORD dwOpt ;
// 家南 可记阑 炼沥茄促.
dwOpt = 8192*5;
setsockopt(m_Socket[pNum], SOL_SOCKET, SO_RCVBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
setsockopt(m_Socket[pNum], SOL_SOCKET, SO_SNDBUF, (const char FAR *)&dwOpt, sizeof(dwOpt));
//
// Socket Connection POOL荤侩
//
m_SocketFD[pNum] = NULL ;
m_SocketFD[pNum] = CreateSocketContext();
if( !m_SocketFD )
{
ErrorMsg("Error memory allocate 1");
m_bSocketStatus[ pNum ] = false;
return false ;
}
_LPPER_BULK_IO_CONTEXT lpIOContext = NULL;
lpIOContext = CreateIOContext( READ );
if( !lpIOContext )
{
ErrorMsg("Error memory allocate 2");
}
//
// 漂沥 矫埃 Wating (3Sec)
//
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL );
if( hEvent ) WaitForSingleObject( hEvent, 3000 ); // 3000ms 父怒 Sleep矫糯
CLOSEHANDLE( hEvent );
g_hIOCP = CreateIoCompletionPort( (HANDLE)m_Socket[pNum], g_hIOCP, (DWORD)m_SocketFD[pNum], 0);
m_SocketFD[pNum]->socket = m_Socket[pNum]; // Sokcet ID
m_SocketFD[pNum]->clientAddr = si_addr ; // Client IP Struct
m_SocketFD[pNum]->bClose = false;
WSABUF wsaBuf;
wsaBuf.buf = lpIOContext->buf;
wsaBuf.len = MAX_BULKBUF_SIZE;
DWORD dwNumberOfBytesRecvd= 0;
DWORD dwFlags = 0;
lpIOContext->lpSocketContext = m_SocketFD[pNum];
int ret ;
ret = WSARecv (
m_SocketFD[pNum]->socket ,
&(wsaBuf) ,
1 ,
&dwNumberOfBytesRecvd ,
&dwFlags ,
(LPWSAOVERLAPPED)lpIOContext,
NULL
);
if( ret == SOCKET_ERROR )
{
if( WSAGetLastError() != ERROR_IO_PENDING )
{
ErrorMsg( "(X) Word Socket Error Code=%d IP=%s PORT=%d",WSAGetLastError(), _Module.m_szWorldIP, _Module.m_nWorldPORT );
CloseClient(m_SocketFD[pNum], lpIOContext );
m_bSocketStatus[ pNum ] = false;
return false;
}
}
m_bSocketStatus[ pNum ] = true;
// 甘辑滚 沥焊甫 焊辰促.
WorldSend_MapInfor(pNum) ;
// MAP SERVER Heart Pulse 傈价
// g_pServer->World_MapHeartPulse();
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// I/O CONTEXT 且寸
//
////////////////////////////////////////////////////////////////////////////////////////
_LPPER_BULK_IO_CONTEXT DBSocket::CreateIOContext(_IO_TYPE io)
{
_LPPER_BULK_IO_CONTEXT lpIOContext = NULL;
lpIOContext = m_pWorldIOPool->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;
lpIOContext->bIsUse = true;
// 2003.08.31 Duke Kim 坷幅 贸府 Code眠啊
lpIOContext->dwMagicNum = MAGIC_NUM;
lpIOContext->nType = DBSOCKET_TYPE ;
}
else
{
ErrorMsg("alloc error in CreateIOContext _PER_BULK_IO_CONTEXT \n");
}
return lpIOContext;
}
////////////////////////////////////////////////////////////////////////////////////////
// Socket Context甫 窍唱 且寸 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
_LPDBSOCKET_FD DBSocket::CreateSocketContext()
{
_LPDBSOCKET_FD lpSktContext = NULL;
lpSktContext = (_DBSOCKET_FD *)SocketPool_Pop();
if(lpSktContext)
{
lpSktContext->nIO = 0;
lpSktContext->socket = INVALID_SOCKET;
}else
{
TRACE("alloc error in CreateSktContext\n");
}
return lpSktContext;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// 2003.08.30 memset俊辑 memory坷幅 惯积
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::ReleaseIOContext( _LPPER_BULK_IO_CONTEXT lpIOContext )
{
// --------------------------------------------------------------------------------
// Error Checking ...
// --------------------------------------------------------------------------------
if( !lpIOContext )
{
ErrorMsg( "(X) World : Release IO Contest IS NULL" );
return;
}
if( lpIOContext->dwMagicNum != MAGIC_NUM )
{
ErrorMsg( "(X) World : Release IO Contest MEMORY ERROR " );
return;
}
if( !lpIOContext->bIsUse )
{
ErrorMsg( "(X) World : Release IO Context NOT USE" );
return;
}
// --------------------------------------------------------------------------------
// 秦寸 IO CONTEXT甫 馆券 矫糯
//
// - 酒贰狼 檬扁拳 风凭狼 鞘夸 咯何 CHECKING
// --------------------------------------------------------------------------------
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;
m_pWorldIOPool->Free(lpIOContext);
lpIOContext = NULL;
}
////////////////////////////////////////////////////////////////////////////////////////
// 荤侩等 Socket Pool阑 馆券 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::ReleaseSocketContext(_LPDBSOCKET_FD lpSktContext)
{
if(lpSktContext)
{
if( !lpSktContext->bClose )
{
/*
memset(lpSktContext, 0x00, sizeof(_DBSOCKET_FD)) ;
memset( lpSktContext->szAccountId ,0x00, sizeof( lpSktContext->szAccountId ) );
memset( lpSktContext->szPlayerId ,0x00, sizeof( lpSktContext->szPlayerId ) );
lpSktContext->wServerGroupID = 0;
lpSktContext->wMapGroupID = 0;
lpSktContext->wMapID = 0;*/
lpSktContext->nIO = 0;
CLOSESOCKET(lpSktContext->socket);
lpSktContext->bClose = true;
SocketPool_Push( lpSktContext );
}
}else{
TRACE("release but that is NULL in ReleaseSktContext \n");
}
}
////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::ReConnect(_LPDBSOCKET_FD lpSocketContext ,_LPPER_BULK_IO_CONTEXT lpIOContext )
{
// 楷搬捞 Close等 World Socket阑 锅龋甫 茫澜
int nTempNum;
for( int i=0; i<MAX_WORLD_SOCKET; i ++ )
{
if(m_Socket[i] == lpSocketContext->socket)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -