📄 mapserversocket.cpp
字号:
// - Client 立加 IP
// - Client 积怕甫 霖厚惑怕肺
// ----------------------------------------------------------------------------
lpSocketFD->socket = SocketCleintFD; // SocketFD
lpSocketFD->clientAddr = clientAddr; // Client IP
lpSocketFD->PlayerStatus = CONNECT_READY; // 立加惑怕
lpSocketFD->bClose = false;
wsaBuf.buf = lpIOContext->buf;
wsaBuf.len = MAX_BUF_SIZE;
// ----------------------------------------------------------------------------
// Read IO甫 悸泼矫糯
// ----------------------------------------------------------------------------
ret = WSARecv
(
lpSocketFD->socket ,
&(wsaBuf) ,
1 ,
&dwNumberOfBytesRecvd ,
&dwFlags ,
(LPWSAOVERLAPPED)lpIOContext,
NULL
);
if( (ret == SOCKET_ERROR ) &&( WSAGetLastError() != ERROR_IO_PENDING))
{
MessagePrint( "[%d] Map Error WSARecv",WSAGetLastError() );
CloseClient( lpSocketFD, lpIOContext );
continue;
}
// ----------------------------------------------------------------------------
// Delay绝捞 Msg焊郴扁 / 抛胶飘 鞘夸
// No Delay
// ----------------------------------------------------------------------------
int TimeOut = 1; // Disable Nagle
int nRet = setsockopt( lpSocketFD->socket, IPPROTO_TCP, TCP_NODELAY, (char *)&TimeOut , sizeof(TimeOut ));
if(nRet == SOCKET_ERROR)
{
ErrorMsg("(X) Map : Accept Option(TCP_NODELAY) Failed: %d\n", WSAGetLastError());
}
m_listConnection.AddTail( lpSocketFD ); // 包府 LIST俊 殿废 矫糯
// ----------------------------------------------------------------------------
// Dbug Message (立加 Client 林家/肮荐 免仿)
// ----------------------------------------------------------------------------
#if defined(_DEBUG) || defined(DEF_BUGTRACE)
MessagePrint( "connect...ok %s ", inet_ntoa(clientAddr.sin_addr ));
CString strMessage;
strMessage.Format("%d / %d",m_listConnection.GetCount(), g_pMap->Count_Player() );
MessageCount( strMessage );
#endif
}
CLOSESOCKET( SocketCleintFD );
// --------------------------------------------------------------------------------
// 辑厚胶啊 混酒 乐阑锭 Thread啊 磷绰 版快
// --------------------------------------------------------------------------------
if( _Module.m_bService )
{
ErrorMsg( "(X) WorkAccept Thread Dead");
}
return;
}
////////////////////////////////////////////////////////////////////////////////////////
// IO窍唱甫 付闷芭唱, SOCKET ERROR 老版快
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::CloseClient(_LPSOCKET_FD lpSktContext, _LPPER_IO_CONTEXT lpIOContext )
{
ReleaseIOContext( lpIOContext );
// --------------------------------------------------------------------------------
// SOCKET ERROR老 锭.. 家南阑 CLOSE
// 措扁吝牢 葛电 IO狼 fail 蜡档
// --------------------------------------------------------------------------------
if( 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 );
}
// --------------------------------------------------------------------------------
// PLAYER / SOCKET 秦力 矫糯
// --------------------------------------------------------------------------------
PlayerLogOut(lpSktContext ); // Player Logout贸府
ReleaseSocketContext( lpSktContext ); // Socket楷搬 秦力
}
////////////////////////////////////////////////////////////////////////////////////////
// Close Client
//
// - Client碍力 辆丰俊 荤侩凳
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::CloseClient(_LPSOCKET_FD lpSktContext)
{
// --------------------------------------------------------------------------------
// SOCKET ERROR老 锭.. 家南阑 CLOSE
// 措扁吝牢 葛电 IO狼 fail 蜡档
// --------------------------------------------------------------------------------
if( 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 );
}
// --------------------------------------------------------------------------------
// Socket楷搬 秦力
// --------------------------------------------------------------------------------
ReleaseSocketContext( lpSktContext );
}
////////////////////////////////////////////////////////////////////////////////////////
// READ PACKET
//
////////////////////////////////////////////////////////////////////////////////////////
void MapServerSocket::WorkReadCompleted( )
{
INT ret;
DWORD dwFlags;
DWORD dwNumberOfBytesRecvd;
_LPPER_IO_CONTEXT lpIOContext;
_LPPER_IO_CONTEXT lpPrevIOContext;
_LPSOCKET_FD lpSktContext;
WSABUF wsaTmp;
BOOL bIOComplete;
char buf[MAX_BUF_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;
// ----------------------------------------------------------------------------
// LIST啊 后 版快
// ----------------------------------------------------------------------------
if(m_listReadCompleted.IsEmpty()) continue;
lpIOContext = (_LPPER_IO_CONTEXT)m_listReadCompleted.RemoveHead();
if( !lpIOContext )
{
ErrorMsg("WorkReadCompleted : IO context is NULL. in WorkIOCompleted");
continue;
}
// ----------------------------------------------------------------------------
// INVALID_SOCKET 捞扼搁, 钮俊 历厘登绢 乐绰 惑炔俊辑 促弗
// Thread俊辑 IO甫 柳青窍促啊 秦寸 remote socket捞 close登菌芭唱
// Socket error啊 惯积窍咯 捞固 closesocket甫 秦 滚赴 版快 弊摹父,
// WRITE 老锭 remote socket捞 罐绊 唱辑 官肺 谗绢 滚府绰 版快档 瞪荐 乐澜
// ----------------------------------------------------------------------------
lpSktContext = (_LPSOCKET_FD)lpIOContext->lpSocketContext;
if( lpSktContext == NULL )
{
ErrorMsg("(X) Map : WorkReadCompleted : 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;
}
// ----------------------------------------------------------------------------
// recv矫 绊妨 荤亲
//
// 1. 菩哦甫 促 罐瘤 给茄 惑怕 -> 捞绢 罐扁
// 2. 茄锅俊 滴俺 捞惑狼 菩哦阑 罐篮 版快 -> 盒府 -> 捞绢罐扁
// ----------------------------------------------------------------------------
if( lpIOContext->io == READ )
{
RETRY: // Recv 俊辑 菩哦阑 2俺 捞惑 罐疽阑锭 促矫 倒酒 柯促.
// --------------------------------------------------------------------
// 捞绢 罐扁 packet捞衬? 梅 罐篮 packet捞衬?
// 梅浚 0蔼阑 啊瘤绊 乐促.
// --------------------------------------------------------------------
if( lpIOContext->dwTotalBytes == 0 )
{
// DWORD 捞惑篮 罐疽促.
if( lpIOContext->dwTransBytes >= sizeof(WORD) )
{
// 弊法促搁, Packet狼 total 荤捞令 历厘
lpIOContext->dwTotalBytes = *(WORD*)&(lpIOContext->buf[0]);
// total 荤捞令啊 MAX_BUF_SIZE 焊促 农促 --; 捞繁 朝涵遏捞
if( lpIOContext->dwTotalBytes > MAX_BUF_SIZE )
{
ErrorMsg("(X) Recv. Total packet size over %d, %d\n", lpIOContext->dwTotalBytes, MAX_BUF_SIZE );
lpIOContext->dwTotalBytes = lpIOContext->dwTransBytes; // 泅犁 荐脚茄 父怒栏肺 力茄茄促.
// 2003.08.26 Duke Kim眠啊
// 眠饶 秦寸 Socket狼 IP Address甫 殿废 矫糯
CloseClient( lpSktContext, lpIOContext );
continue;
}
}
else // 霉 DWORD 滴 给 罐疽促.. --;
{
wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes; // 捞饶何磐 罐霸 茄促.
wsaTmp.len = MAX_BUF_SIZE - lpIOContext->dwTransBytes; // 酒流 dwTotalBytes绰 0 捞促.
}
}
// --------------------------------------------------------------------
// Total 荤捞令 父怒 促 罐疽唱?
// --------------------------------------------------------------------
if( lpIOContext->dwTotalBytes > 0 )
{
// ----------------------------------------------------------------
// 捞锅 菩哦阑 促 罐瘤 给 茄 版快
// ----------------------------------------------------------------
if( lpIOContext->dwTransBytes < lpIOContext->dwTotalBytes )
{
wsaTmp.buf = lpIOContext->buf + lpIOContext->dwTransBytes; // 捞饶何磐 罐霸 秦具瘤..
wsaTmp.len = MAX_BUF_SIZE - lpIOContext->dwTransBytes; // 倔付甫 歹 罐酒具 窍绰瘤 舅妨 拎具瘤..
}
// ----------------------------------------------------------------
// PACKT阑 OVER窍咯 罐篮 版快
// ----------------------------------------------------------------
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;
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
//Jason 2004-09-28
//捞巴东俊 俊矾 惯积. 棵靛 蔼阑 啊瘤绊 乐绢辑 0捞 酒匆锭啊 乐促.
//if(lpPrevIOContext->dwCurrentSpeedTick == 0)
{
//Jason 2004-08-19-china
//0 捞扼搁 菩哦捞 辨霸 甸绢 客辑 货肺 且寸 罐酒辑 弊繁促.
//捞傈 菩哦捞 泅犁 菩哦焊促 矫埃捞 累酒具 盔劝窍霸 悼累 茄促.
//捞傈 菩哦俊 泅犁 矫埃俊辑 1阑 猾 蔼阑 历厘茄促.
//泅犁 矫埃阑 1 刘啊 矫虐搁 促澜俊 捞 风凭栏肺 甸绢 棵 版快,
//捞傈 蔼阑 1阑 临咯档 弊 捞傈 焊窜 农绊 泅犁 焊窜 累霸 等促.
//InterlockedExchange((LPLONG)&(lpPrevIOContext->dwCurrentSpeedTick ), lpIOContext->dwCurrentSpeedTick - 1);
//InterlockedIncrement((LPLONG)&(lpIOContext->dwCurrentSpeedTick ));
lpPrevIOContext->dwCurrentSpeedTick = lpIOContext->dwCurrentSpeedTick - 1;
(lpIOContext->dwCurrentSpeedTick)++;
//go back to the before.
//lpPrevIOContext->dwCurrentSpeedTick = lpIOContext->dwCurrentSpeedTick;
}
#endif
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;
}
}
// ----------------------------------------------------------------
// PACKT阑 促 罐篮 版快
// ----------------------------------------------------------------
else
{
bIOComplete = 1;
}
}
if( bIOComplete )
{
ReadPacket( lpIOContext ); // 促 罐疽栏搁 recved 肺 啊辑 贸府窍绊
lpIOContext = CreateIOContext(READ); // 货肺款 IO甫 且寸罐酒辑 促矫 措扁 矫挪促.
if( lpIOContext )
{
wsaTmp.buf = lpIOContext->buf;
wsaTmp.len = MAX_BUF_SIZE;
}
else
{
wsaTmp.buf = NULL;
wsaTmp.len = 0;
break;
}
}
ret = WSARecv
(
lpSktContext->socket ,
&wsaTmp ,
1 ,
&dwNumberOfBytesRecvd ,
&dwFlags ,
(LPWSAOVERLAPPED)lpIOContext,
NULL
);
if( ret == SOCKET_ERROR && ( WSAGetLastError() != ERROR_IO_PENDING))
{
ErrorMsg( "2.Error WSARecv, error code = %d", WSAGetLastError());
CloseClient( lpSktContext, lpIOContext );
}
}
else
{
ErrorMsg( "(X) .Error NOT IO READ" );
ReleaseIOContext(lpIOContext);
}
}
// --------------------------------------------------------------------------------
// 辑厚胶啊 混酒 乐阑锭 Thread啊 磷绰 版快 (Duke Kim 2003.08.27)
// --------------------------------------------------------------------------------
if( _Module.m_bService )
{
ErrorMsg( "(X) ReadCompleted Thread Dead");
}
}
//////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -