📄 dbsocket.cpp
字号:
nTempNum = i;
m_bSocketStatus[i] = false;
break;
}
}
TRACE("remote is close \n" );
CloseClient( lpSocketContext , lpIOContext );
if( nTempNum >= MAX_WORLD_SOCKET ) return; // Close等 Socket阑 茫瘤 给窍绰 版快
if( !_Module.m_bService ) return; // 辑厚胶 吝瘤
///////////////////////////////////////////////////////////////////
// 泅犁 荤侩吝牢 Socket捞 Close等 版快 促澜 Connection栏肺 捞悼 矫糯
// (促澜 Socket捞 Close等 版快 促澜 Socket栏肺 捞悼 矫糯)
///////////////////////////////////////////////////////////////////
int nTempNextNum;
if( nTempNum == m_nNowSocketNum )
{
nTempNextNum = nTempNum;
for( int i=0; i < MAX_WORLD_SOCKET; i ++ )
{
nTempNextNum ++;
if( nTempNextNum >= MAX_WORLD_SOCKET )
nTempNextNum = 0;
if( m_bSocketStatus[ nTempNextNum ] )
{
m_nNowSocketNum = nTempNextNum;
ErrorMsg( "[%d] World Socket Move",m_nNowSocketNum);
break;
}
}
///////////////////////////////////////////////////////////////////
// 葛电 World Server Socket捞 Close等 版快
//
// - WORLD SERVER立加 矫档
///////////////////////////////////////////////////////////////////
if( i >= MAX_WORLD_SOCKET )
{
_Module.m_ServerStatus = SERVER_DISCONNECTWORLD; // DISCONNECT MODE
// 秦寸 World Server Socket汗备
for( i=0; i < MAX_WORLD_SOCKET; i ++ )
{
int bReturn = false;
while( !bReturn )
{
ErrorMsg( "(X) %d WORD SOCKET Reconnect" , i );
bReturn = bConnect( i, true );
}
}
_Module.m_ServerStatus = SERVER_START; // START MODE
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
// IO窍唱甫 付闷芭唱, SOCKET ERROR 老版快
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::CloseClient(_LPDBSOCKET_FD lpSktContext, _LPPER_BULK_IO_CONTEXT lpIOContext )
{
ReleaseIOContext( lpIOContext );
// --------------------------------------------------------------------------------
// SOCKET ERROR老 锭.. 家南阑 close窍绊, 措扁吝牢 葛电 IO狼 fail 蜡档茄促.
// bGraceful 捞 FALSE 捞搁 , error芭唱, remote close扼绊 魄窜茄促.
// bGraceful 捞 TRUE 捞搁 , 秦寸 IO甫 肋 付闷促绊 魄窜茄促.
// --------------------------------------------------------------------------------
if( lpSktContext && lpSktContext->socket != INVALID_SOCKET )
{
LINGER LingerStruct;
LingerStruct.l_onoff = 1;
LingerStruct.l_linger = 0;
setsockopt(lpSktContext->socket, SOL_SOCKET, SO_LINGER,(char*)&LingerStruct, sizeof(LingerStruct));
CLOSESOCKET( lpSktContext->socket );
TRACE("closesocket\n");
}
ReleaseSocketContext(lpSktContext) ;
}
////////////////////////////////////////////////////////////////////////////////////////
// Read Packet
//
////////////////////////////////////////////////////////////////////////////////////////
void DBSocket::WorkReadCompleted()
{
TRACE("Read Completed start ......\n");
INT ret;
DWORD dwFlags;
DWORD dwNumberOfBytesRecvd;
_LPPER_BULK_IO_CONTEXT lpIOContext;
_LPPER_BULK_IO_CONTEXT lpPrevIOContext;
_LPDBSOCKET_FD lpSktContext;
WSABUF wsaTmp;
BOOL bIOComplete;
char buf[MAX_BULKBUF_SIZE];
while( _Module.m_bService )
{
ret = 0;
dwFlags = 0;
dwNumberOfBytesRecvd = 0;
lpIOContext = NULL;
lpPrevIOContext = NULL;
lpSktContext = NULL;
wsaTmp.buf = NULL;
wsaTmp.len = 0;
bIOComplete = 0;
// list 绝澜 措扁
if(m_listReadCompleted.IsEmpty())
WaitForSingleObject (m_hReadEventCompleted,INFINITE);
if( !_Module.m_bService ) break; // 橇肺弊伐 辆丰
if(m_listReadCompleted.IsEmpty()) continue; // 促矫 list 八刘
lpIOContext = (_LPPER_BULK_IO_CONTEXT)m_listReadCompleted.RemoveHead();
if( lpIOContext == NULL)
{
ErrorMsg("IO context is NULL. in WorkIOCompleted\n");
continue;
}
// INVALID_SOCKET 捞扼搁, 钮俊 历厘登绢 乐绰 惑炔俊辑 促弗 Thread俊辑 IO甫 柳青窍促啊
// 秦寸 remote socket捞 close登菌芭唱 socket error啊 惯积窍咯 捞固 closesocket甫 秦 滚赴 版快
// 弊摹父, WRITE 老锭 remote socket捞 罐绊 唱辑 官肺 谗绢 滚府绰 版快档 瞪荐 乐促.
lpSktContext = (_LPDBSOCKET_FD)lpIOContext->lpSocketContext;
if( lpSktContext == NULL )
{
ErrorMsg("socket context is NULL. in WorkIOCompleted\n");
ReleaseIOContext(lpIOContext);
continue;
}
if( lpSktContext->socket == INVALID_SOCKET )
{
TRACE("socket is INVALID_SOCKET. in WorkIOCompleted\n");
CloseClient( lpSktContext, lpIOContext );
continue;
}
RETRY: // Recv 俊辑 菩哦阑 2俺 捞惑 罐疽阑锭 促矫 倒酒 柯促.
/* ------------------------------------------------------------
recv矫 绊妨 荤亲
1. 菩哦甫 促 罐瘤 给茄 惑怕 -> 捞绢 罐扁
2. 茄锅俊 滴俺 捞惑狼 菩哦阑 罐篮 版快 -> 盒府 -> 捞绢罐扁
-------------------------------------------------------------- */
if( lpIOContext->io == READ )
{
/*
捞绢 罐扁 packet捞衬? 梅 罐篮 packet捞衬?
梅浚 0蔼阑 啊瘤绊 乐促.
*/
if( lpIOContext->dwTotalBytes == 0 )
{
// DWORD 捞惑篮 罐疽促.
if( lpIOContext->dwTransBytes >= sizeof(WORD) )
{
// 弊法促搁, Packet狼 total 荤捞令 历厘
lpIOContext->dwTotalBytes = *(WORD*)&(lpIOContext->buf[0]);
// total 荤捞令啊 MAX_BULKBUF_SIZE 焊促 农促 --; 捞繁 朝涵遏捞
if( lpIOContext->dwTotalBytes >= MAX_BULKBUF_SIZE )
{
#ifdef DEF_KUMA_CHECK_PACKET
WORD _wCmd = *(WORD*)&(lpIOContext->buf[2]);
ErrorMsg("(X)World : Recv. Total packet size over %d, %d CMD(%d)\n", lpIOContext->dwTotalBytes, MAX_BULKBUF_SIZE, _wCmd );
#else
ErrorMsg("(X)World : Recv. Total packet size over %d, %d\n", lpIOContext->dwTotalBytes, MAX_BULKBUF_SIZE );
#endif
lpIOContext->dwTotalBytes = lpIOContext->dwTransBytes; // 泅犁 荐脚茄 父怒栏肺 力茄茄促.
}
}
else // 霉 DWORD 滴 给 罐疽促.. --;
{
wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes; // 捞饶何磐 罐霸 茄促.
wsaTmp.len = MAX_BULKBUF_SIZE - lpIOContext->dwTransBytes; // 酒流 dwTotalBytes绰 0 捞促.
}
}
// Total 荤捞令 父怒 促 罐疽唱?
if( lpIOContext->dwTotalBytes > 0 )
{
if( lpIOContext->dwTransBytes < lpIOContext->dwTotalBytes ) // 捞锅 菩哦阑 促 罐瘤 给沁促.
{
wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes; // 捞饶何磐 罐霸 秦具瘤..
wsaTmp.len = lpIOContext->dwTotalBytes - lpIOContext->dwTransBytes; // 倔付甫 歹 罐酒具 窍绰瘤 舅妨 拎具瘤..
}
else if( lpIOContext->dwTransBytes > lpIOContext->dwTotalBytes ) // 歹 罐疽尺~
{
lpPrevIOContext = CreateIOContext(READ);
if(lpPrevIOContext)
{
lpPrevIOContext->dwTotalBytes = lpIOContext->dwTotalBytes;
lpPrevIOContext->dwTransBytes = lpIOContext->dwTotalBytes;
memcpy( lpPrevIOContext->buf ,lpIOContext->buf , lpIOContext->dwTransBytes) ;
lpPrevIOContext->lpSocketContext = lpSktContext;
ReadPacket( lpPrevIOContext );
lpIOContext->dwTransBytes -= lpIOContext->dwTotalBytes;
memcpy( buf , lpIOContext->buf + lpIOContext->dwTotalBytes , lpIOContext->dwTransBytes );
lpIOContext->dwTotalBytes = 0;
memcpy( lpIOContext->buf , buf , lpIOContext->dwTransBytes );
goto RETRY;
}
}
else
{
bIOComplete = 1; // 促 罐疽促. ^^
}
}
if( bIOComplete )
{
ReadPacket( lpIOContext); // 促 罐疽栏搁 recved 肺 啊辑 贸府窍绊
lpIOContext = CreateIOContext(READ); // 货肺款 IO甫 且寸罐酒辑 促矫 措扁 矫挪促.
if( lpIOContext )
{
wsaTmp.buf = lpIOContext->buf;
wsaTmp.len = MAX_BULKBUF_SIZE;
}
else
{
ErrorMsg("(X) World : IO context alloc error POOL=%d. in WorkIOCompleted()", m_pWorldIOPool->GetCount() );
wsaTmp.buf = NULL;
wsaTmp.len = 0;
break;
}
}
//------------------------------------------------------------------------------------------------------------------
// io count狼 刘啊客 WSARecv(..) call篮 概莫登绢具 茄促.
ret = WSARecv(lpSktContext->socket,&wsaTmp, 1, &dwNumberOfBytesRecvd, &dwFlags, (LPWSAOVERLAPPED)lpIOContext, NULL);
//------------------------------------------------------------------------------------------------------------------
if( ret == SOCKET_ERROR && ( WSAGetLastError() != ERROR_IO_PENDING))
{
ErrorMsg( "(X) 2. DB Error WSARecv, error code = %d ",WSAGetLastError() );
CloseClient( lpSktContext, lpIOContext );
}
}
}
// Thread啊 厚沥惑利栏肺 辆丰 茄绰 版快 贸府
if( _Module.m_bService )
{
ErrorMsg("(X) World : IO Read Completed terminate");
}
}
////////////////////////////////////////////////////////////////////////////////////////
// Read Packet
//
// 罐篮 Packet Protocol喊肺 秦寸 累诀阑 荐青
// ----------------------------------------------------
// 1. ZP_ECHO / ZP_BROADCAST 扁夯栏肺 荤侩
// 2. Server Monitoring侩 Packet 眠啊 累诀
////////////////////////////////////////////////////////////////////////////////////////
BOOL DBSocket::ReadPacket( _LPPER_BULK_IO_CONTEXT lpIOContext)
{
_LPDBPACKET lpDBPacket = (_LPDBPACKET)lpIOContext->buf;
_LPDBSOCKET_FD lpSocketFD = (_LPDBSOCKET_FD)lpIOContext->lpSocketContext;
lpDBPacket->dwSize -= DBPACKETHEADER_SIZE ;
// try
// {
////////////////////////////////////////////////////////////////////
// NOTENOTE: 菩哦 鞠龋拳
//
////////////////////////////////////////////////////////////////////
WORD wCheckSum = PacketDecrypt(lpDBPacket->strPacket, lpDBPacket->dwSize, lpDBPacket->dwSeq&31) ;
if ((lpDBPacket->wCheckSum != wCheckSum) )
{
char cMsg[200] ;
wsprintf(cMsg,"(X) World : CheckSum Error (P:%d C:%d) SIZE(%d) CMD(%d) SEQ(%d)",lpDBPacket->wCheckSum, wCheckSum, lpDBPacket->dwSize,lpDBPacket->dwCommand,lpDBPacket->dwSeq) ;
// 2003.08.28 Duke Kim Log函版
ErrorMsg( cMsg );
// #if _DEBUG
// MessagePrint(cMsg) ;
// #else
// _Module.LogEvent(cMsg) ;
// #endif
}
else
{
// 肺弊牢 辑滚 加档 氢惑阑 困秦 窃荐 器牢磐 荤侩
// 窃荐 器牢磐 荤侩矫 滚弊 规瘤甫 困秦 菩哦 裹困甫 疙矫 秦具窃
// IF 巩栏肺 菩哦狼 裹困甫 眉农且 鞘夸啊 乐促.
#ifdef _DEBUG
PacketTrace(lpDBPacket->dwCommand) ;
#endif
#ifdef DEF_USEONESOCKET
// 泅犁 荤侩吝牢 家南俊 坷绰 菩哦栏肺 坷绰 沥焊父 罐绰促.
if( m_SocketFD[ m_nNowSocketNum ] == lpSocketFD)
{
OnTransFunc[lpDBPacket->dwCommand].proc(this, lpIOContext );
}
#else
OnTransFunc[lpDBPacket->dwCommand].proc(this, lpIOContext );
#endif
} // if (lpDBPacket->wCheckSum != wCheckSum)
/*
}
catch( ... )
{
static int x = 0;
char cMsg[200] ;
wsprintf(cMsg,"(X)(%d) Unhandled msg[%d] ",x++, lpDBPacket->dwCommand) ;
#if _DEBUG
MessagePrint(cMsg) ;
#else
_Module.LogEvent(cMsg) ;
#endif
}
*/
// ---------------------------------------------------------------------
// Recv IO啊 肯丰登搁 货肺款 IO 滚橇甫 父甸绢 WSARecv 措扁 矫淖促..
// 扁粮 Recv甫 肯丰茄 滚橇狼 积疙篮 咯扁 鳖瘤促.
// ---------------------------------------------------------------------
ReleaseIOContext( lpIOContext );
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////
// NOTENOTE: 辑滚 加档 氢惑阑 困秦 窃荐 器牢磐 荤侩
//
////////////////////////////////////////////////////////////////////////////////////////
void WorldPacket_Nothing(_LPDBSOCK lpWorldSock, _LPPER_BULK_IO_CONTEXT lpIOContext )
{
return ;
}
////////////////////////////////////////////////////////////////////////////////////////
// PLAYER CLOSE
//
// - SOCKET FD蔼阑 犁劝 咯何 犬牢
// - 秦寸 荤侩磊甫 茫酒辑 碍犁肺 昏力 矫糯
// - 茫瘤 给茄 版快 WORLD SERVER俊 皋矫瘤 傈价
/////////////////////////////////////////////////////////////////////////////////////////
void WorldPacket_PlayerClose(_LPDBSOCK lpWorldSock, _LPPER_BULK_IO_CONTEXT lpIOContext )
{
_LPDBPACKET pDBPacket = (_LPDBPACKET)lpIOContext->buf;
_LPSOCKET_FD pSocketFD = (_LPSOCKET_FD)pDBPacket->pSocketFD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -