2024-12-21 10:04:04 +08:00
# include "StdAfx.h"
# include <MMSystem.h>
# include "ClientSessionManager.h"
# include "ClientSocket.h"
# include "ClientTcpSession.h"
# include "ClientUdpSession.h"
# include "NetSocketRUDP.h"
# include "NetSocketUDP.h"
# include "DNPacket.h"
# include "DNProtocol.h"
# include "MessageListener.h"
# include "Log.h"
# include "DNProtocol.h"
# include <stdlib.h>
# ifdef _DEBUG
# define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
# endif
CSeqReceiver : : CSeqReceiver ( )
{
ResetSeq ( ) ;
}
CSeqReceiver : : ~ CSeqReceiver ( )
{
m_RecvSync . Lock ( ) ;
m_ProcessSync . Lock ( ) ;
std : : list < _SEQ_DATA > : : iterator ii ;
for ( ii = m_pRecvList . begin ( ) ; ii ! = m_pRecvList . end ( ) ; ii + + )
SAFE_DELETEA ( ( * ii ) . pBuf ) ;
m_pRecvList . clear ( ) ;
m_pProcessList . clear ( ) ;
m_ProcessSync . UnLock ( ) ;
m_RecvSync . UnLock ( ) ;
}
void CSeqReceiver : : RecvData ( DNEncryptPacketSeq * pPacket )
{
//from tcp
if ( pPacket - > cSeq = = UNSEQUENCEPACKET | | m_cDataSeq = = pPacket - > cSeq )
{
m_RecvSync . Lock ( ) ;
if ( pPacket - > cSeq ! = 0 ) m_cDataSeq + = 2 ;
m_RecvSync . UnLock ( ) ;
AddProcessData ( pPacket - > Packet . cMainCmd , pPacket - > Packet . cSubCmd , pPacket - > Packet . buf , pPacket - > Packet . iLen , _SEQDATA_TYPE_DIRECT ) ;
}
else
RecvSeqData ( pPacket - > cSeq , & pPacket - > Packet ) ;
CheckSeqData ( ) ;
}
void CSeqReceiver : : RecvData ( DNTCompPacket * pPacket )
{
//from tcp compress packet
if ( pPacket - > header . cSeq = = UNSEQUENCEPACKET | | m_cDataSeq = = pPacket - > header . cSeq )
{
m_RecvSync . Lock ( ) ;
if ( pPacket - > header . cSeq ! = 0 ) m_cDataSeq + = 2 ;
m_RecvSync . UnLock ( ) ;
AddProcessData ( pPacket - > header . cMainCmd , pPacket - > header . cSubCmd , pPacket - > buf , pPacket - > header . nLen , _SEQDATA_TYPE_DIRECT ) ;
}
else
RecvSeqData ( pPacket - > header . cSeq , pPacket - > header . cMainCmd , pPacket - > header . cSubCmd , pPacket - > buf , pPacket - > header . nLen ) ;
CheckSeqData ( ) ;
}
void CSeqReceiver : : RecvData ( DNGAME_PACKET * pPacket )
{
//from udp
if ( pPacket - > seq = = UNSEQUENCEPACKET | | m_cDataSeq = = pPacket - > seq )
{
m_RecvSync . Lock ( ) ;
if ( pPacket - > seq ! = 0 ) m_cDataSeq + = 2 ;
m_RecvSync . UnLock ( ) ;
AddProcessData ( pPacket - > header , pPacket - > sub_header , pPacket - > data , pPacket - > datasize , _SEQDATA_TYPE_DIRECT ) ;
}
else
RecvSeqData ( pPacket - > seq , pPacket - > header , pPacket - > sub_header , pPacket - > data , pPacket - > datasize ) ;
CheckSeqData ( ) ;
}
void CSeqReceiver : : SkipProcess ( )
{
InterlockedExchange ( & m_nSkipProcess , SkipFlag ) ;
}
void CSeqReceiver : : AddProcessData ( BYTE cMainCmd , BYTE cSubCmd , char * pData , int nSize , int nSeqDataType )
{
_SEQ_DATA Seq ;
memset ( & Seq , 0 , sizeof ( Seq ) ) ;
Seq . nLen = nSize ;
Seq . cMainCmd = cMainCmd ;
Seq . cSubCmd = cSubCmd ;
switch ( nSeqDataType )
{
case _SEQDATA_TYPE_DIRECT :
{
if ( Seq . nLen > 0 ) {
Seq . pBuf = new char [ Seq . nLen ] ;
memcpy ( Seq . pBuf , pData , Seq . nLen ) ;
}
else {
Seq . pBuf = NULL ;
}
m_ProcessSync . Lock ( ) ;
m_pProcessList . push_back ( Seq ) ;
m_ProcessSync . UnLock ( ) ;
break ;
}
case _SEQDATA_TYPE_SEQ :
{
Seq . pBuf = pData ;
m_ProcessSync . Lock ( ) ;
m_pProcessList . push_back ( Seq ) ;
m_ProcessSync . UnLock ( ) ;
break ;
}
case _SEQDATA_TYPE_RECURSIVE :
{
if ( Seq . nLen > 0 ) {
Seq . pBuf = new char [ Seq . nLen ] ;
memcpy ( Seq . pBuf , pData , Seq . nLen ) ;
}
else {
Seq . pBuf = NULL ;
}
m_pProcessList . push_front ( Seq ) ;
break ;
}
}
}
void CSeqReceiver : : ClearProcessData ( )
{
{
ScopeLock < CSyncLock > sync ( m_RecvSync ) ;
for ( std : : list < _SEQ_DATA > : : iterator ii = m_pRecvList . begin ( ) ; ii ! = m_pRecvList . end ( ) ; ii + + )
SAFE_DELETEA ( ( * ii ) . pBuf ) ;
m_pRecvList . clear ( ) ;
}
{
ScopeLock < CSyncLock > sync ( m_ProcessSync ) ;
for ( std : : list < _SEQ_DATA > : : iterator ii = m_pProcessList . begin ( ) ; ii ! = m_pProcessList . end ( ) ; ii + + )
SAFE_DELETEA ( ( * ii ) . pBuf ) ;
m_pProcessList . clear ( ) ;
}
}
void CSeqReceiver : : ResetSeq ( )
{
m_cDataSeq = 3 ;
InterlockedExchange ( & m_nSkipProcess , 0 ) ;
}
void CSeqReceiver : : RecvSeqData ( BYTE cSeq , DNTPacket * pData )
{
_SEQ_DATA Seq ;
memset ( & Seq , 0 , sizeof ( Seq ) ) ;
Seq . cSeq = cSeq ;
Seq . nLen = pData - > iLen ;
Seq . cMainCmd = pData - > cMainCmd ;
Seq . cSubCmd = pData - > cSubCmd ;
Seq . pBuf = new char [ Seq . nLen ] ;
memcpy ( Seq . pBuf , pData - > buf , Seq . nLen ) ;
m_RecvSync . Lock ( ) ;
m_pRecvList . push_back ( Seq ) ;
m_RecvSync . UnLock ( ) ;
}
void CSeqReceiver : : RecvSeqData ( BYTE cSeq , BYTE cMainCmd , BYTE cSubCmd , char * pData , int nSize )
{
_SEQ_DATA Seq ;
memset ( & Seq , 0 , sizeof ( Seq ) ) ;
Seq . cSeq = cSeq ;
Seq . nLen = nSize ;
Seq . cMainCmd = cMainCmd ;
Seq . cSubCmd = cSubCmd ;
Seq . pBuf = new char [ Seq . nLen ] ;
memcpy ( Seq . pBuf , pData , Seq . nLen ) ;
m_RecvSync . Lock ( ) ;
m_pRecvList . push_back ( Seq ) ;
m_RecvSync . UnLock ( ) ;
}
void CSeqReceiver : : CheckSeqData ( )
{
m_RecvSync . Lock ( ) ;
std : : list < _SEQ_DATA > : : iterator ii ;
for ( ii = m_pRecvList . begin ( ) ; ii ! = m_pRecvList . end ( ) ; )
{
_SEQ_DATA * pSeq = & ( * ii ) ;
if ( m_cDataSeq = = pSeq - > cSeq )
{
m_cDataSeq + = 2 ;
AddProcessData ( pSeq - > cMainCmd , pSeq - > cSubCmd , pSeq - > pBuf , pSeq - > nLen , _SEQDATA_TYPE_SEQ ) ;
ii = m_pRecvList . erase ( ii ) ;
}
else ii + + ;
}
m_RecvSync . UnLock ( ) ;
}
# if defined( PRE_TEST_PACKETMODULE )
CClientSessionManager : : CClientSessionManager ( CClientSocket * pTcpSocket /*=NULL*/ )
# else
CClientSessionManager : : CClientSessionManager ( )
# endif // #if defined( PRE_TEST_PACKETMODULE )
{
WSADATA wsadata ;
WSAStartup ( MAKEWORD ( 2 , 2 ) , & wsadata ) ;
# if defined( PRE_TEST_PACKETMODULE )
if ( pTcpSocket )
m_pTcpSocket = pTcpSocket ;
else
m_pTcpSocket = new CClientSocket ;
# else
m_pTcpSocket = new CClientSocket ;
# endif // #if defined( PRE_TEST_PACKETMODULE )
m_pTcpSocket - > SetReceiver ( this ) ;
m_pRUDPSocket = NULL ;
m_pUDPSocket = NULL ;
m_bConnectLoginServer = false ;
m_bConnectVillageServer = false ;
m_bConnectGameServer = false ;
m_bDisConnectServer = false ;
m_ConnectState = BridgeUnknown ;
memset ( m_szVillageIP , 0 , sizeof ( m_szVillageIP ) ) ;
m_nVillagePort = 0 ;
m_nGameServerIP = 0 ; ;
m_nGameServerUdpPort = m_nGameServerTcpPort = 0 ;
m_nLastLoginConnectOffset = 0 ;
}
CClientSessionManager : : ~ CClientSessionManager ( )
{
DisconnectGameServer ( true ) ;
DisconnectLoginServer ( true ) ;
DisconnectVillageServer ( true ) ;
SAFE_DELETE ( m_pTcpSocket ) ;
SAFE_DELETE ( m_pRUDPSocket ) ;
SAFE_DELETE ( m_pUDPSocket ) ;
SAFE_DELETE_VEC ( m_pTaskListener ) ;
WSACleanup ( ) ;
}
void CClientSessionManager : : SendTcpPacket ( int iMainCmd , int iSubCmd , char * pData , int iLen )
{
m_pTcpSocket - > AddSendData ( iMainCmd , iSubCmd , pData , iLen ) ;
WriteLog ( 1 , " , Info, CClientSessionManager::SendPacket : TCP - iMainCmd(%d), iSubCmd(%d), iLen(%d), \n " , iMainCmd , iSubCmd , iLen ) ;
}
void CClientSessionManager : : SendPacket ( int iMainCmd , int iSubCmd , char * pData , int iLen , int iPrior , BYTE cSeqLevel )
{
bool bChecker = false ;
WriteLog ( 1 , " , Info, Send Connection State : Login(%c), Village(%c), Game(%c) \n " , ( m_bConnectLoginServer ) ? ' o ' : ' x ' , ( m_bConnectVillageServer ) ? ' o ' : ' x ' , ( m_bConnectGameServer ) ? ' o ' : ' x ' ) ;
//rlkt_udp !
if ( m_bConnectLoginServer | | m_bConnectVillageServer ) //|| m_bConnectGameServer
{
m_pTcpSocket - > AddSendData ( iMainCmd , iSubCmd , pData , iLen ) ;
bChecker = true ;
WriteLog ( 1 , " , Info, CClientSessionManager::SendPacket : TCP - iMainCmd(%d), iSubCmd(%d), iLen(%d), iPrior(%d) \n " , iMainCmd , iSubCmd , iLen , iPrior ) ;
}
if ( m_bConnectGameServer )
{
_ASSERT ( bChecker ! = true ) ;
RUDPSendPacket ( iMainCmd , iSubCmd , pData , iLen , iPrior , cSeqLevel ) ;
WriteLog ( 1 , " , Info, CClientSessionManager::SendPacket : UDP - iMainCmd(%d), iSubCmd(%d), iLen(%d), iPrior(%d) \n " , iMainCmd , iSubCmd , iLen , iPrior ) ;
}
}
void CClientSessionManager : : RecvPacket ( int iMainCmd , int iSubCmd , char * pData , int iLen , int nInsertAfter )
{
AddProcessData ( ( BYTE ) iMainCmd , ( BYTE ) iSubCmd , pData , iLen , _SEQDATA_TYPE_RECURSIVE ) ;
WriteLog ( 1 , " , Info, CClientSessionManager::RecvPacket : iMainCmd(%d), iSubCmd(%d), iLen(%d), nInsertAfter(%d) \n " , iMainCmd , iSubCmd , iLen , nInsertAfter ) ;
}
void CClientSessionManager : : DisConnectServer ( bool bValidDisconnect )
{
m_bValidDisConnect = bValidDisconnect ;
m_bDisConnectServer = true ;
}
bool CClientSessionManager : : ConnectLoginServer ( const char * pIP , USHORT nPort , bool bFirstConnect )
{
if ( bFirstConnect )
{
WriteLog ( 0 , " , Info, Connect LoginServer.. \n " ) ;
WriteLog ( 1 , " , Info, ConnectLoginServer : IP(%s), Port(%d) \n " , pIP , nPort ) ;
WriteLog ( 1 , " , Info, Cur Connection State : Login(%c), Village(%c), Game(%c) \n " , ( m_bConnectLoginServer ) ? ' o ' : ' x ' , ( m_bConnectVillageServer ) ? ' o ' : ' x ' , ( m_bConnectGameServer ) ? ' o ' : ' x ' ) ;
if ( m_bConnectLoginServer ) DisconnectLoginServer ( true ) ;
if ( m_bConnectVillageServer ) DisconnectVillageServer ( true ) ;
if ( m_bConnectGameServer ) DisconnectGameServer ( true ) ;
bool bResult = m_pTcpSocket - > Connect ( pIP , nPort ) ;
if ( bResult = = false ) {
WriteLog ( 1 , " , Error, ConnectLoginServer Result Failed \n " ) ;
WriteLog ( 0 , " , Error, Connect LoginServer Failed \n " ) ;
return false ;
}
m_bConnectLoginServer = true ;
WriteLog ( 1 , " , Info, ConnectLoginServer Result Succeess \n " ) ;
WriteLog ( 0 , " , Info, Connect LoginServer Success \n " ) ;
# if defined( PRE_ADD_HSHIELD_LOG )
if ( strstr ( pIP , " 211.39.159.3 " ) )
CGlobalInfo : : GetInstance ( ) . m_bUseHShieldLog = true ;
# endif // #if defined( PRE_ADD_HSHIELD_LOG )
}
else
{
// strcpy_s(m_szLoginIP, pIP);
// m_nLoginPort = nPort;
m_ConnectState = ( eBridgeState ) VillageToLogin ; //<2F> <> <EFBFBD> <EFBFBD> Ʈ<EFBFBD> <C6AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> °<EFBFBD> <C2B0> <EFBFBD> <EFBFBD> <EFBFBD> <20> ״<EFBFBD> <D7B4> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .
}
return true ;
}
bool CClientSessionManager : : ConnectLoginServer ( std : : vector < std : : string > & szVecIP , std : : vector < USHORT > & nVecPort , bool bFirstConnect )
{
srand ( timeGetTime ( ) ) ;
m_szLoginVecIPList = szVecIP ;
m_nVecLoginPortList = nVecPort ;
if ( m_nLastLoginConnectOffset > = ( int ) m_szLoginVecIPList . size ( ) ) m_nLastLoginConnectOffset = 0 ;
if ( bFirstConnect ) {
int nConnectTrialCount = 1 + ( ( int ) m_szLoginVecIPList . size ( ) * 2 ) ;
# if defined(PRE_FIX_LOGINSERVER_CONNECT)
m_nLastLoginConnectOffset = rand ( ) % ( int ) m_szLoginVecIPList . size ( ) ;
# else // #if defined(PRE_FIX_LOGINSERVER_CONNECT)
int m_nLastLoginConnectOffset = rand ( ) % ( int ) m_szLoginVecIPList . size ( ) ;
# endif // #if defined(PRE_FIX_LOGINSERVER_CONNECT)
for ( int i = 0 ; i < nConnectTrialCount ; i + + ) {
std : : string szIP = m_szLoginVecIPList [ m_nLastLoginConnectOffset ] ;
USHORT nPort = m_nVecLoginPortList [ m_nLastLoginConnectOffset ] ;
if ( ConnectLoginServer ( szIP . c_str ( ) , nPort , true ) ) return true ;
m_nLastLoginConnectOffset + + ;
if ( m_nLastLoginConnectOffset > = ( int ) m_szLoginVecIPList . size ( ) ) m_nLastLoginConnectOffset = 0 ;
}
}
else {
std : : string szIP = m_szLoginVecIPList [ m_nLastLoginConnectOffset ] ;
USHORT nPort = m_nVecLoginPortList [ m_nLastLoginConnectOffset ] ;
return ConnectLoginServer ( szIP . c_str ( ) , nPort , false ) ;
}
return false ;
}
bool CClientSessionManager : : ConnectVillageServer ( const char * pIP , USHORT nPort , int nBridgeState )
{
_strcpy ( m_szVillageIP , _countof ( m_szVillageIP ) , pIP , ( int ) strlen ( pIP ) ) ;
m_nVillagePort = nPort ;
m_ConnectState = ( eBridgeState ) nBridgeState ;
return true ;
}
void CClientSessionManager : : ConnectServer ( )
{
switch ( m_ConnectState )
{
case BridgeUnknown :
return ;
case GameToLogin :
case VillageToLogin :
{
WriteLog ( 0 , " , Info, Connect LoginServer.. \n " ) ;
WriteLog ( 1 , " , Info, ConnectLoginServer : IP(%s), Port(%d) \n " , m_szLoginVecIPList [ m_nLastLoginConnectOffset ] . c_str ( ) , m_nVecLoginPortList [ m_nLastLoginConnectOffset ] ) ;
WriteLog ( 1 , " , Info, Cur Connection State : Login(%c), Village(%c), Game(%c) \n " , ( m_bConnectLoginServer ) ? ' o ' : ' x ' , ( m_bConnectVillageServer ) ? ' o ' : ' x ' , ( m_bConnectGameServer ) ? ' o ' : ' x ' ) ;
if ( m_bConnectLoginServer ) DisconnectLoginServer ( true ) ;
if ( m_bConnectVillageServer ) DisconnectVillageServer ( true ) ;
if ( m_bConnectGameServer ) DisconnectGameServer ( true ) ;
bool bResult = m_pTcpSocket - > Connect ( m_szLoginVecIPList [ m_nLastLoginConnectOffset ] . c_str ( ) , m_nVecLoginPortList [ m_nLastLoginConnectOffset ] ) ;
if ( bResult = = false ) {
WriteLog ( 1 , " , Error, ConnectLoginServer Result Failed \n " ) ;
WriteLog ( 0 , " , Error, Connect LoginServer Failed \n " ) ;
m_nLastLoginConnectOffset + + ;
if ( m_nLastLoginConnectOffset > = ( int ) m_szLoginVecIPList . size ( ) ) m_nLastLoginConnectOffset = 0 ;
return ;
}
m_bConnectLoginServer = true ;
WriteLog ( 1 , " , Info, ConnectLoginServer Result Succeess \n " ) ;
WriteLog ( 0 , " , Info, Connect LoginServer Success \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( true , m_ConnectState , 0 , 0 ) ;
break ;
}
case LoginToVillage :
case GameToVillage :
case VillageToVillage :
{
WriteLog ( 0 , " , Info, Connect VillageServer.. \n " ) ;
WriteLog ( 1 , " , Info, ConnectVillageServer : IP(%s), Port(%d) \n " , m_szVillageIP , m_nVillagePort ) ;
WriteLog ( 1 , " , Info, Cur Connection State : Login(%c), Village(%c), Game(%c) \n " , ( m_bConnectLoginServer ) ? ' o ' : ' x ' , ( m_bConnectVillageServer ) ? ' o ' : ' x ' , ( m_bConnectGameServer ) ? ' o ' : ' x ' ) ;
if ( m_bConnectLoginServer ) DisconnectLoginServer ( true ) ;
if ( m_bConnectVillageServer ) {
if ( strcmp ( m_pTcpSocket - > GetServerIP ( ) , m_szVillageIP ) = = NULL & & m_pTcpSocket - > GetServerPort ( ) = = m_nVillagePort )
{
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( true , m_ConnectState , 0 , 0 ) ;
break ;
}
DisconnectVillageServer ( true ) ;
}
if ( m_bConnectGameServer ) DisconnectGameServer ( true ) ;
bool bResult = m_pTcpSocket - > Connect ( m_szVillageIP , m_nVillagePort ) ;
if ( bResult = = false ) {
WriteLog ( 1 , " , Error, ConnectVillageServer Result Failed \n " ) ;
WriteLog ( 0 , " , Error, Connect VillageServer Failed \n " ) ;
return ;
}
m_bConnectVillageServer = true ;
WriteLog ( 1 , " , Info, ConnectVillageServer Result Success \n " ) ;
WriteLog ( 0 , " , Info, Connect VillageServer Success \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( true , m_ConnectState , 0 , 0 ) ;
break ;
}
case VillageToGame :
{
WriteLog ( 0 , " , Info, Connect GameServer.. \n " ) ;
WriteLog ( 1 , " , Info, ConnectGameServer : IP(%d), Port(%d), TcpPort(%d), UID(%d) \n " , m_nGameServerIP , m_nGameServerUdpPort , m_nGameServerTcpPort , m_nSessionID ) ;
WriteLog ( 1 , " , Info, Cur Connection State : Login(%c), Village(%c), Game(%c) \n " , ( m_bConnectLoginServer ) ? ' o ' : ' x ' , ( m_bConnectVillageServer ) ? ' o ' : ' x ' , ( m_bConnectGameServer ) ? ' o ' : ' x ' ) ;
if ( m_bConnectLoginServer ) DisconnectLoginServer ( true ) ;
if ( m_bConnectVillageServer ) DisconnectVillageServer ( true ) ;
if ( m_bConnectGameServer ) DisconnectGameServer ( true ) ;
if ( InitializeUdpSession ( m_nGameServerUdpPort ) = = false ) {
WriteLog ( 1 , " , Error, ConnectGameServer Result Failed : InitializeUpdSession \n " ) ;
WriteLog ( 0 , " , Error, Connect GameServer Failed \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( false , m_ConnectState , m_cReqGameIDType , m_nGameTaskType ) ;
break ;
}
ResetSeq ( ) ;
if ( RUDPConnect ( m_nGameServerIP , m_nGameServerUdpPort , m_nSessionID ) = = false ) {
WriteLog ( 1 , " , Error, ConnectGameServer Result Failed : RUDPConnect \n " ) ;
WriteLog ( 0 , " , Error, Connect GameServer Failed \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( false , m_ConnectState , m_cReqGameIDType , m_nGameTaskType ) ;
break ;
}
char szIP [ IPLENMAX ] ;
_inet_addr ( m_nGameServerIP , szIP ) ;
# ifdef PRE_MOD_INDUCE_TCPCONNECT
bool bConnected = false ;
for ( int nTryCount = 0 ; nTryCount < 5 ; nTryCount + + )
{
if ( m_pTcpSocket - > Connect ( szIP , m_nGameServerTcpPort ) )
{
bConnected = true ;
break ;
}
Sleep ( 100 ) ;
continue ;
}
if ( bConnected = = false )
{
WriteLog ( 1 , " , Error, ConnectGameServer Result Failed : TCPConnect \n " ) ;
WriteLog ( 0 , " , Error, Connect GameServer Failed \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( false , m_ConnectState , m_cReqGameIDType , m_nGameTaskType ) ;
break ;
}
# else //#ifdef PRE_MOD_INDUCE_TCPCONNECT
if ( m_pTcpSocket - > Connect ( szIP , m_nGameServerTcpPort ) = = false )
{
WriteLog ( 1 , " , Error, ConnectGameServer Result Failed : TCPConnect \n " ) ;
WriteLog ( 0 , " , Error, Connect GameServer Failed \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( false , m_ConnectState , m_cReqGameIDType , m_nGameTaskType ) ;
break ;
}
# endif //#ifdef PRE_MOD_INDUCE_TCPCONNECT
m_bConnectGameServer = true ; WriteLog ( 1 , " , Info, ConnectGameServer Result Success \n " ) ;
WriteLog ( 0 , " , Info, Connect GameServer Success \n " ) ;
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > ConnectResult ( true , m_ConnectState , m_cReqGameIDType , m_nGameTaskType ) ;
}
}
m_ConnectState = BridgeUnknown ;
}
bool CClientSessionManager : : ReconnectGameServer ( UINT nSessionID )
{
WriteLog ( 0 , " , Info, Reconnect GameServer.. \n " ) ;
WriteLog ( 1 , " , Info, ReconnectGameServer : SessionID(%d) \n " , nSessionID ) ;
WriteLog ( 1 , " , Info, Cur Connection State : Login(%c), Village(%c), Game(%c) \n " , ( m_bConnectLoginServer ) ? ' o ' : ' x ' , ( m_bConnectVillageServer ) ? ' o ' : ' x ' , ( m_bConnectGameServer ) ? ' o ' : ' x ' ) ;
if ( m_bConnectGameServer )
{
//<2F> <> <EFBFBD> <EFBFBD> <20> <> Ȳ<EFBFBD> ̾<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> Ǿ<EFBFBD> <C7BE> <EFBFBD> ! <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ٰ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ǿ<EFBFBD> <C7BE> <EFBFBD> <EFBFBD> ϴ<EFBFBD> . <20> <EFBFBD> <EEB6BB> <20> ǵ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> հ <EFBFBD> rudp<64> <70> <20> <EFBFBD> <DEBC> <EFBFBD> <EFBFBD> <EFBFBD> <20> µ<DEB4> <C2B5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̴ϴ<CCB4> .
//tcp<63> <70> <20> <> <EFBFBD> ܾ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ǵ<EFBFBD> <20> <> ! <20> ̹Ƿ<CCB9> <20> 翬<EFBFBD> <E7BFAC> <EFBFBD> <EFBFBD> <20> õ<EFBFBD> <C3B5> մϴ<D5B4> .
if ( InitializeUdpSession ( m_nGameServerUdpPort ) = = false ) {
WriteLog ( 1 , " , Error, ReconnectGameServer Result Failed : m_nGameServerUdpPort(%d) \n " , m_nGameServerUdpPort ) ;
WriteLog ( 0 , " , Error, Reconnect GameServer Failed \n " ) ;
return false ;
}
RUDPDisConnect ( ) ;
bool bResult = RUDPConnect ( m_nGameServerIP , m_nGameServerUdpPort , nSessionID ) ;
if ( ! bResult ) {
WriteLog ( 1 , " , Error, ReconnectGameServer Result Failed : RUDPConnect : m_nGameServerIP(%d), m_nGameServerUdpPort(%d) \n " , m_nGameServerIP , m_nGameServerUdpPort ) ;
WriteLog ( 0 , " , Error, Reconnect GameServer Failed \n " ) ;
}
else {
WriteLog ( 1 , " , Info, ReconnectGameServer Result Success \n " ) ;
WriteLog ( 0 , " , Info, Reconnect GameServer Success \n " ) ;
}
return bResult ;
}
return false ;
}
void CClientSessionManager : : DisconnectLoginServer ( bool bValidDisconnect )
{
if ( ! m_bConnectLoginServer ) return ;
m_pTcpSocket - > Close ( true , bValidDisconnect ) ;
m_bConnectLoginServer = false ;
WriteLog ( 0 , " , Info, Disconnect LoginServer.. \n " ) ;
ClearProcessData ( ) ;
}
void CClientSessionManager : : DisconnectVillageServer ( bool bValidDisconnect )
{
if ( ! m_bConnectVillageServer ) return ;
m_pTcpSocket - > Close ( true , bValidDisconnect ) ;
m_bConnectVillageServer = false ;
WriteLog ( 0 , " , Info, Disconnect VillageServer.. \n " ) ;
ClearProcessData ( ) ;
}
bool CClientSessionManager : : ConnectGameServer ( unsigned long iIP , unsigned short iPort , unsigned short nTcpPort , int iUID , int nBridgeState , char cReqGameIDType , int nGameTaskType )
{
m_nGameServerIP = iIP ;
m_nGameServerUdpPort = iPort ;
m_nGameServerTcpPort = nTcpPort ;
m_nSessionID = iUID ;
m_ConnectState = ( eBridgeState ) nBridgeState ;
m_cReqGameIDType = cReqGameIDType ;
m_nGameTaskType = nGameTaskType ;
return true ;
}
void CClientSessionManager : : DisconnectGameServer ( bool bValidDisconnect )
{
if ( ! m_bConnectGameServer ) return ;
if ( bValidDisconnect ) {
SendPacket ( CS_SYSTEM , eSystem : : CS_INTENDED_DISCONNECT , NULL , 0 , _RELIABLE ) ;
}
# ifdef PRE_ADD_THREAD_ROOMDESTROY_TEST
m_pTcpSocket - > Close ( true , bValidDisconnect ) ;
ULONG uiStartTick = timeGetTime ( ) ;
while ( 1 )
{
SendPacket ( CS_PARTY , eParty : : CS_PARTYOUT , NULL , 0 ) ;
Sleep ( 10 ) ;
if ( timeGetTime ( ) - uiStartTick > ( 10 * 1000 ) )
break ;
}
RUDPDisConnect ( ) ;
m_bConnectGameServer = false ;
# else //#ifdef PRE_ADD_THREAD_ROOMDESTROY_TEST
RUDPDisConnect ( ) ;
m_pTcpSocket - > Close ( true , bValidDisconnect ) ;
m_bConnectGameServer = false ;
# endif //#ifdef PRE_ADD_THREAD_ROOMDESTROY_TEST
WriteLog ( 0 , " , Info, Disconnect GameServer.. \n " ) ;
ClearProcessData ( ) ;
}
bool CClientSessionManager : : RUDPConnect ( unsigned long iIP , unsigned short iPort , int iUID )
{
if ( m_pRUDPSocket )
{
struct in_addr addr ;
addr . S_un . S_addr = iIP ;
if ( m_pRUDPSocket - > Connect ( addr . S_un . S_addr , iPort ) = = false ) {
WriteLog ( 1 , " , Error, CClientSessionManager::RUDPConnect1 Result Failed : IP(%d), Port(%d) \n " , addr . S_un . S_addr , iPort ) ;
return false ;
}
# ifdef _USE_NATPROBE
m_pRUDPSocket - > DetectAddr ( s_szProbeIP [ 1 ] , s_nProbePort [ 1 ] ) ;
# endif
CSConnectRequest packet ;
packet . nSessionID = iUID ;
WCHAR wszIP [ 32 ] ;
if ( GetLocalIP ( wszIP ) )
packet . nAddrIP = _inet_addr ( wszIP ) ;
else
_ASSERT ( 0 ) ;
packet . nPort = GetUdpPort ( ) ;
m_pRUDPSocket - > Send ( CS_SYSTEM , eSystem : : CS_CONNECT_REQUEST , & packet , sizeof ( packet ) , _RELIABLE , 0 ) ;
OutputDebug ( " Send RUDP Connect Msg \n " ) ;
}
return true ;
}
//bool CClientSessionManager::RUDPConnect(const char * pIP, unsigned short iPort, int iUID)
//{
// if (m_pRUDPSocket)
// {
// struct in_addr addr;
// addr.S_un.S_addr = _inet_addr(pIP);
// if (m_pRUDPSocket->Connect(addr.S_un.S_addr, iPort) == false) {
// WriteLog( 1, ", Error, CClientSessionManager::RUDPConnect2 Result Failed : IP(%s, %d), Port(%d), iUID(%d) \n", pIP, addr.S_un.S_addr, iPort, iUID );
// return false;
// }
//
//#ifdef _USE_NATPROBE
// m_pRUDPSocket->DetectAddr(s_szProbeIP[1], s_nProbePort[1]);
// if (m_pUDPSocket)
// m_pUDPSocket->DetectAddr(s_szProbeIP[1], s_nProbePort[1]);
//#endif
//
// CSConnectRequest packet;
// memset(&packet, 0, sizeof(packet));
// packet.nSessionID= iUID;
//
// m_pRUDPSocket->GetAddr(&packet.nAddrIP, &packet.nPort);
//#ifdef _USE_NATPROBE
// if (packet.nPort <= 0)
// {
// //Probe<62> <65> <20> <> <EFBFBD> Ͽ<EFBFBD> <20> ּҸ<D6BC> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ߽<EFBFBD> <DFBD> ϴ<EFBFBD> . <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> TCP<43> <50> public<69> ּҸ<D6BC> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ͼ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ݴϴ<DDB4> .
// //Ŭ<> <C5AC> <EFBFBD> ̾<EFBFBD> Ʈ<EFBFBD> <C6AE> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> Ʈ<EFBFBD> <C6AE> <20> ٸ<EFBFBD> <20> <> <20> ֽ<EFBFBD> <D6BD> ϴ<EFBFBD> . <20> <> Ʈ<EFBFBD> <C6AE> <20> <> Ŀȣ <C4BF> <C8A3> Ʈ<EFBFBD> <C6AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> ɴϴ<C9B4> .
// WCHAR wszIP[32];
// if (GetLocalIP(wszIP))
// packet.nAddrIP = _inet_addr(wszIP);
// else _ASSERT(0);
// packet.nPort = GetUdpPort();
// }
//#endif
//
// m_pRUDPSocket->Send(CS_SYSTEM, eSystem::CS_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
// OutputDebug("Send RUDP Connect Msg\n");
// }
// return true;
//}
void CClientSessionManager : : RUDPDisConnect ( )
{
if ( m_pRUDPSocket )
m_pRUDPSocket - > DisConnect ( ) ;
m_UDPPeerList . clear ( ) ;
}
//void CClientSessionManager::RUDPRecieve(int iMainCmd, int iSubCmd, char * data, int size, _ADDR * addr)
//{
// //Check PeerManage
// if (iMainCmd == SC_SYSTEM)
// {
// switch (iSubCmd)
// {
// case eSystem::CC_PEER_CONNECT_REQUEST:
// {
// //Client Peer Connect Request
// CCPeerConnectRequest * pPacket = (CCPeerConnectRequest*)data;
//
// if (pPacket->cState == 0)
// { //Client A -> client B Peer Connect Request Msg
// if (IsPeerConnected(pPacket->nSessionID[0]) == false) //Check Sender ID
// { //if Not Connect Connection
// //Make Packet
// CCPeerConnectRequest packet;
// memcpy(&packet, pPacket, sizeof(CCPeerConnectRequest));
// packet.cState = 1;
//
/ / OutputDebug ( " step 2 connect request sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d \n " , pPacket - > nSessionID [ 0 ] , pPacket - > nSessionID [ 1 ] , \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
/ / WriteLog ( 1 , " , Info, step 2 connect request sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d \n " , pPacket - > nSessionID [ 0 ] , pPacket - > nSessionID [ 1 ] , \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
//
// //Notify To Sender
// for (int i = 0; i < 3; i++) //considering loss packet
// UDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _inet_addr(addr->ip), htons(addr->port));
// }
// }
// else if (pPacket->cState == 1)
// { //Client B -> Client A Peer Connected Msg
// if (IsPeerConnected(pPacket->nSessionID[1]) == false)
// {
/ / OutputDebug ( " step 3 connected result sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d \n " , pPacket - > nSessionID [ 0 ] , pPacket - > nSessionID [ 1 ] , \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
/ / WriteLog ( 1 , " , Info, step 3 connected result sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d \n " , pPacket - > nSessionID [ 0 ] , pPacket - > nSessionID [ 1 ] , \
// addr->ip[0], addr->ip[1], addr->ip[2], addr->ip[3], htons(addr->port));
//
// AddPeer(_inet_addr(addr->ip), htons(addr->port), pPacket->nSessionID[1]); //adding peer
// CCPeerConnectRequest packet;
// memcpy(&packet, pPacket, sizeof(CCPeerConnectRequest));
// //Notify To Server
// RUDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
// }
// }
// else if (pPacket->cState == 2)
// { //Client A -> B Peer DisConnected Msg
// if (IsPeerConnected(pPacket->nSessionID[0]) == true)
// RemovePeer(pPacket->nSessionID[0]);
// }
// return;
// }
//
// case eSystem::SC_PEER_CONNECT_REQUEST:
// {
// //Server Peer Connect Request
// SCPeerConnectRequest * pPacket = (SCPeerConnectRequest*)data;
// CCPeerConnectRequest packet;
//
// //<2F> <> <EFBFBD> Ӽ<EFBFBD> <D3BC> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> Ǿ<EFBFBD> <C7BE> <EFBFBD> <EFBFBD> <EFBFBD> Ʈ<EFBFBD> ϶<EFBFBD> <CFB6> <EFBFBD> <20> <> û<EFBFBD> <C3BB> <20> ҽ <DEBE> <D2BD> ϴ<EFBFBD> .
// packet.cState = 0;
// packet.nSessionID[0] = pPacket->nSessionID[0]; //My ConID
// packet.nSessionID[1] = pPacket->nSessionID[1]; //Your ConID
/ / OutputDebug ( " step 1 connect request recv from server sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d \n " , pPacket - > nSessionID [ 0 ] , pPacket - > nSessionID [ 1 ] , \
/ / ( ( unsigned char * ) & pPacket - > nDestAddrIP ) [ 0 ] , \
/ / ( ( unsigned char * ) & pPacket - > nDestAddrIP ) [ 1 ] , ( ( unsigned char * ) & pPacket - > nDestAddrIP ) [ 2 ] , \
// ((unsigned char*)&pPacket->nDestAddrIP)[3], pPacket->nDestAddrPort);
/ / WriteLog ( 1 , " , Info, step 1 connect request recv from server sender con : %d, recv con : %d, ip:%d.%d.%d.%d port:%d \n " , pPacket - > nSessionID [ 0 ] , pPacket - > nSessionID [ 1 ] , \
/ / ( ( unsigned char * ) & pPacket - > nDestAddrIP ) [ 0 ] , \
/ / ( ( unsigned char * ) & pPacket - > nDestAddrIP ) [ 1 ] , ( ( unsigned char * ) & pPacket - > nDestAddrIP ) [ 2 ] , \
// ((unsigned char*)&pPacket->nDestAddrIP)[3], pPacket->nDestAddrPort);
// for (int i = 0; i < 3; i++) //considering loss packet
// UDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), pPacket->nDestAddrIP, pPacket->nDestAddrPort);
// return;
// }
//
// case eSystem::CC_PEER_PING:
// {
// //<2F> ι <EFBFBD> <CEB9> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> .
// int seq;
// memcpy(&seq, data, sizeof(seq));
// UDPSendPacket(CS_SYSTEM, eSystem::CC_PEER_PONG, (char*)&seq, sizeof(seq), _inet_addr(addr->ip), htons(addr->port));
// return;
// }
//
// case eSystem::CC_PEER_PONG:
// {
// static unsigned int s_nAmount = 0;
// static unsigned int s_nPing = 0;
// static unsigned int s_nCnt = 0;
// int seq;
// memcpy(&seq, data, sizeof(seq));
//
// std::vector<_PEER>::iterator ii;
// for (ii = m_UDPPeerList.begin(); ii != m_UDPPeerList.end(); ii++)
// {
// if (_inet_addr((*ii).addr.ip) == _inet_addr(addr->ip) && (*ii).addr.port == htons(addr->port))
// {
// (*ii).Ping[seq].nPing = timeGetTime() - (*ii).Ping[seq].nSendTick;
//
// s_nAmount += (*ii).Ping[seq].nPing;
// s_nCnt++;
// s_nPing = s_nAmount/s_nCnt;
//
// if (s_nCnt >= 32)
// { //<2F> 뷫 32<33> <32> <EFBFBD> <EFBFBD> <20> ѹ<EFBFBD> <D1B9> <EFBFBD> <EFBFBD> <EFBFBD> <20> ʱ<EFBFBD> ȭ <20> մϴ<D5B4> .
// OutputDebug("Peer Ping seq : [%d] ping : [%d]\n", seq, s_nPing);
// s_nAmount = s_nCnt = 0;
// //<2F> 뷫 <20> <> Ÿ<EFBFBD> ֿ̹<CCB9> <20> <> <EFBFBD> <EFBFBD> ġ<EFBFBD> <C4A1> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ̻<EFBFBD> <CCBB> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> !
// if (s_nPing > 400)
// {//<2F> 뷫 400<30> <30> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ٰ<EFBFBD> <20> <> <EFBFBD> ´ <EFBFBD> <20> <> <EFBFBD> <EFBFBD> ġ<EFBFBD> <C4A1> 200<30> <30> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϱ <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .. <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȯ<> <C8AE> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// //<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ϴ<EFBFBD> <20> <> ƾ<EFBFBD> <C6BE> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> ô<EFBFBD> .
// UINT nSessionID = (*ii).iUID;
// RemovePeer(nSessionID);
//
// CCPeerConnectRequest packet;
// memset(&packet, 0, sizeof(packet));
//
// packet.cState = 2;
// packet.nSessionID[1] = nSessionID;
//
// RUDPSendPacket( CS_SYSTEM, eSystem::CC_PEER_CONNECT_REQUEST, &packet, sizeof(packet), _RELIABLE);
// }
// }
// return ;
// }
// }
// OutputDebug("Peer Ping Update Failed\n");
// WriteLog(1, ", Error, Peer Ping Update Failed\n");
// return;
// }
// }
// }
//
// for(unsigned int i = 0; i < (unsigned int)m_pVecUdpSession.size(); i++)
// m_pVecUdpSession[i]->OnDispatchMessage( iMainCmd, iSubCmd, data, size );
//}
void CClientSessionManager : : RUDPSendPacket ( int iMainCmd , int iSubCmd , void * pData , int iSize , int iPrior , BYTE cSeqLevel )
{
if ( m_pRUDPSocket )
m_pRUDPSocket - > Send ( iMainCmd , iSubCmd , pData , iSize , iPrior , cSeqLevel ) ;
if ( m_pUDPSocket ! = NULL & & ( iMainCmd = = CS_ACTOR | | iMainCmd = = CS_ACTORBUNDLE ) ) // || iMainCmd == CS_PROP))
{
//Peer<65> <72> <20> ٷ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> Ǵ°<C7B4> <20> <> <EFBFBD> ϴ<EFBFBD> . (Actor Msg, Prop Msg)
unsigned short iSwapHeader = SC_ACTOR ;
std : : vector < _PEER > : : iterator ii ;
for ( ii = m_UDPPeerList . begin ( ) ; ii ! = m_UDPPeerList . end ( ) ; ii + + )
UDPSendPacket ( iSwapHeader , iSubCmd , pData , iSize , _inet_addr ( ( * ii ) . addr . ip ) , ( * ii ) . addr . port ) ;
}
}
void CClientSessionManager : : UDPSendPacket ( int iMainCmd , int iSubCmd , void * pData , int iSize , unsigned long iIP , unsigned short iPort )
{
if ( m_pUDPSocket )
m_pUDPSocket - > Send ( iMainCmd , iSubCmd , pData , iSize , iIP , iPort ) ;
}
bool CClientSessionManager : : InitializeUdpSession ( USHORT nPort )
{
if ( m_pRUDPSocket = = NULL )
{
m_pRUDPSocket = new CNetSocketRUDP ;
if ( ! m_pRUDPSocket ) return false ;
m_pRUDPSocket - > SetReceiver ( this ) ;
}
# ifdef _USE_PERRCONNECT
if ( m_pUDPSocket = = NULL ) {
m_pUDPSocket = new CNetSocketUDP ( " UDPThread " , m_pRUDPSocket ) ;
if ( ! m_pUDPSocket ) return false ;
if ( m_pUDPSocket - > Create ( ) = = true )
m_pUDPSocket - > SetReciever ( this ) ;
}
# endif
return true ;
}
bool CClientSessionManager : : FinalizeUdpSession ( )
{
SAFE_DELETE ( m_pRUDPSocket ) ;
SAFE_DELETE ( m_pUDPSocket ) ;
return true ;
}
//void CClientSessionManager::AddTcpSession( CClientTcpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecTcpSession.size(); i++ ) {
// if( m_pVecTcpSession[i] == pSession ) return;
// }
// m_pVecTcpSession.push_back( pSession );
//}
//
//void CClientSessionManager::AddUdpSession( CClientUdpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecUdpSession.size(); i++ ) {
// if( m_pVecUdpSession[i] == pSession ) return;
// }
// m_pVecUdpSession.push_back( pSession );
//}
//
//void CClientSessionManager::RemoveTcpSession( CClientTcpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecTcpSession.size(); i++ ) {
// if( m_pVecTcpSession[i] == pSession ) {
// m_pVecTcpSession.erase( m_pVecTcpSession.begin() + i ) ;
// return;
// }
// }
//}
//
//void CClientSessionManager::RemoveUdpSession( CClientUdpSession *pSession )
//{
// for( DWORD i=0; i<m_pVecUdpSession.size(); i++ ) {
// if( m_pVecUdpSession[i] == pSession ) {
// m_pVecUdpSession.erase( m_pVecUdpSession.begin() + i );
// return;
// }
// }
//}
void CClientSessionManager : : OnConnectTcp ( )
{
std : : vector < CTaskListener * > : : iterator ii ;
for ( ii = m_pTaskListener . begin ( ) ; ii ! = m_pTaskListener . end ( ) ; ii + + )
( * ii ) - > OnConnectTcp ( ) ;
/*DWORD dwCount = (DWORD)m_pVecTcpSession.size();
for ( DWORD i = 0 ; i < dwCount ; i + + ) {
m_pVecTcpSession [ i ] - > OnConnectTcp ( ) ;
} */
}
void CClientSessionManager : : OnDisconnectTcp ( bool bValidDisconnect )
{
std : : vector < CTaskListener * > : : iterator ii ;
for ( ii = m_pTaskListener . begin ( ) ; ii ! = m_pTaskListener . end ( ) ; ii + + )
( * ii ) - > OnDisconnectTcp ( bValidDisconnect ) ;
/*DWORD dwCount = (DWORD)m_pVecTcpSession.size();
for ( DWORD i = 0 ; i < dwCount ; i + + ) {
m_pVecTcpSession [ i ] - > OnDisconnectTcp ( bValidDisconnect ) ;
} */
}
//void CClientSessionManager::OnDispatchMessageTcp( int iMainCmd, int iSubCmd, char * pData, int iLen )
//{
// DWORD dwCount = (DWORD)m_pVecTcpSession.size();
// for( DWORD i=0; i<dwCount; i++ ) {
// m_pVecTcpSession[i]->OnDispatchMessage( iMainCmd, iSubCmd, pData, iLen );
// }
//
//
// std::vector<MessageListener*>::iterator it = m_MessageListenerArray.begin();
// for ( ; it != m_MessageListenerArray.end() ; it++ )
// {
// MessageListener* pListener = NULL;
// pListener = *it;
// if ( pListener )
// {
// pListener->OnDispatchMessage(iMainCmd, iSubCmd, pData, iLen);
// }
// }
//}
//void CClientSessionManager::SendGameTcpConnect(UINT nSessionID, UINT nAccountDBID, INT64 biCertifyingKey)
//{
// //<2F> ϴ<EFBFBD> <20> <> <EFBFBD> ⼭ <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD>
// CSConnectGame packet;
// memset(&packet, 0, sizeof(packet));
// packet.nSessionID = nSessionID;
// packet.nAccountDBID = nAccountDBID;
// packet.biCertifyingKey = biCertifyingKey;
//#if defined(_KR)
// {
// CSystemInfo Info;
// Info.Init();
//
// memcpy(Login.szMID, Info.GetMachineId(), sizeof(Login.szMID));
// Login.dwGRC = Info.GetGameRoomClient();
// }
//#endif
//
// m_pTcpSocket->AddSendData(CS_SYSTEM, eSystem::CS_CONNECTGAME, (char*)&packet, sizeof(packet));
//}
void CClientSessionManager : : OnDisconnectUdp ( bool bValidDisconnect )
{
std : : vector < CTaskListener * > : : iterator ii ;
for ( ii = m_pTaskListener . begin ( ) ; ii ! = m_pTaskListener . end ( ) ; ii + + )
( * ii ) - > OnDisconnectUdp ( bValidDisconnect ) ;
}
void CClientSessionManager : : Process ( )
{
if ( m_pTcpSocket )
{
if ( m_pTcpSocket - > DoUpdate ( ) = = - 1 )
{
m_pTcpSocket - > Close ( ) ;
return ;
}
else
{
//<2F> 뷫 <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> 忡<EFBFBD> <E5BFA1> <20> \ <EFBFBD> <EFBCBC> Ŭ<> <C5AC> <EFBFBD> ̾<EFBFBD> Ʈ <20> <> <EFBFBD> ξ<EFBFBD> <CEBE> <EFBFBD> <EFBFBD> <EFBFBD> , <20> <> Ʈ<EFBFBD> <C6AE> ũ <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> (udp, tcp), <20> ε<EFBFBD> <CEB5> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 尡 <20> <> <EFBFBD> ڽ<EFBFBD> <DABD> ϴ<EFBFBD> .
//<2F> <> Ŷ<EFBFBD> <C5B6> <EFBFBD> <EFBFBD> Ÿ<EFBFBD> <C5B8> <20> <EFBFBD> <20> <> <EFBFBD> ⼭ <20> ÷<EFBFBD> <C3B7> <EFBFBD> <20> <> <EFBFBD> ִµ<D6B4> <20> <> ġ<EFBFBD> <C4A1> <20> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ġ<EFBFBD> <C4A1> ó<> <C3B3> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> Ʈ<EFBFBD> <C6AE> ũ<EFBFBD> <C5A9> <EFBFBD> <EFBFBD> <EFBFBD> 嵵 ũ<> <C5A9> Ƽ Į<C6BC> <C4AE> <EFBFBD> ǿ<EFBFBD> <C7BF> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ɸ<EFBFBD> <C9B8> <EFBFBD> <20> <> <EFBFBD> ·<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ǹǷ<C7B9> ,
//<2F> ϴ<EFBFBD> <20> <> <EFBFBD> ϰ<EFBFBD> ó<> <C3B3> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> .
std : : list < _SEQ_DATA > ProcessList ;
std : : list < _SEQ_DATA > : : iterator ii ;
{
ScopeLock < CSyncLock > sync ( m_ProcessSync ) ;
ProcessList = m_pProcessList ;
m_pProcessList . clear ( ) ;
}
for ( ii = ProcessList . begin ( ) ; ii ! = ProcessList . end ( ) ; ii + + )
{
for ( int i = 0 ; i < ( int ) m_pTaskListener . size ( ) ; i + + )
m_pTaskListener [ i ] - > OnDispatchMessage ( ( * ii ) . cMainCmd , ( * ii ) . cSubCmd , ( * ii ) . pBuf , ( * ii ) . nLen ) ;
for ( int i = 0 ; i < ( int ) m_MessageListenerArray . size ( ) ; i + + )
{
if ( m_MessageListenerArray [ i ] )
m_MessageListenerArray [ i ] - > OnDispatchMessage ( ( * ii ) . cMainCmd , ( * ii ) . cSubCmd , ( * ii ) . pBuf , ( * ii ) . nLen ) ;
}
if ( m_bDisConnectServer )
break ;
if ( InterlockedIncrement ( & m_nSkipProcess ) & SkipFlag )
{
InterlockedExchange ( & m_nSkipProcess , 0 ) ;
break ;
}
}
for ( ii = ProcessList . begin ( ) ; ii ! = ProcessList . end ( ) ; ii + + )
SAFE_DELETEA ( ( * ii ) . pBuf ) ;
ProcessList . clear ( ) ;
}
}
if ( m_bDisConnectServer )
{
DisconnectLoginServer ( m_bValidDisConnect ) ;
DisconnectVillageServer ( m_bValidDisConnect ) ;
DisconnectGameServer ( m_bValidDisConnect ) ;
m_bDisConnectServer = false ;
}
ConnectServer ( ) ;
}
void CClientSessionManager : : AddTaskListener ( CTaskListener * pListener )
{
std : : vector < CTaskListener * > : : iterator ii ;
for ( ii = m_pTaskListener . begin ( ) ; ii ! = m_pTaskListener . end ( ) ; ii + + )
if ( ( * ii ) = = pListener ) return ;
m_pTaskListener . push_back ( pListener ) ;
}
void CClientSessionManager : : RemoveTaskListener ( CTaskListener * pListener )
{
std : : vector < CTaskListener * > : : iterator ii ;
for ( ii = m_pTaskListener . begin ( ) ; ii ! = m_pTaskListener . end ( ) ; ii + + )
{
if ( ( * ii ) = = pListener )
{
m_pTaskListener . erase ( ii ) ;
return ;
}
}
}
BOOL CClientSessionManager : : GetLocalIP ( WCHAR * pIP )
{
return m_pTcpSocket - > GetLocalIP ( pIP ) ;
}
USHORT CClientSessionManager : : GetLocalPort ( void )
{
return m_pTcpSocket - > GetLocalPort ( ) ;
}
const char * CClientSessionManager : : GetUdpIP ( )
{
return m_pTcpSocket - > GetServerIP ( ) ;
}
USHORT CClientSessionManager : : GetUdpPort ( )
{
return m_pUDPSocket ? m_pUDPSocket - > GetPort ( ) : 0 ;
}
# ifdef _USE_NATPROBE
void CClientSessionManager : : SetProbeInfo ( const char * pTcpIP , const char * pUdpIP , int nTcpPort , int nUdpPort , int nOpenPort )
{
_strcpy ( s_szProbeIP [ 0 ] , _countof ( s_szProbeIP [ 0 ] ) , pTcpIP , ( int ) strlen ( pTcpIP ) ) ;
_strcpy ( s_szProbeIP [ 1 ] , _countof ( s_szProbeIP [ 1 ] ) , pUdpIP , ( int ) strlen ( pUdpIP ) ) ;
s_nProbePort [ 0 ] = nTcpPort ;
s_nProbePort [ 1 ] = nUdpPort ;
s_bNetOpen = false ;
s_nPeerOpenPort = nOpenPort ;
DWORD dwThreadID ;
HANDLE hThread ;
hThread = CreateThread ( 0 , 0 , _Accept_Test , ( void * ) NULL , 0 , & dwThreadID ) ;
WaitForSingleObject ( hThread , 10 * 1000 ) ;
}
# endif
DWORD WINAPI CClientSessionManager : : _Accept_Test ( void * param )
{
SOCKET hUDP ;
fd_set fdset ;
int readbytes , addrlen , cnt , udpport ;
char buffer [ 2048 ] ;
int pingtotal = 0 , pingtest = 0 ;
timeval tm ;
SOCKADDR_IN addr ;
int state = 0 ;
int pivot ;
timeBeginPeriod ( 1 ) ;
hUDP = CreateUDPSocket ( s_nPeerOpenPort ) ;
for ( cnt = 0 ; cnt < 10 & & state < 2 ; cnt + + ) // 10 <20> <> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> ش<EFBFBD> .
{
switch ( state )
{
case 0 : {
static char _msg [ ] = " orz " ;
memset ( & addr , 0 , sizeof ( addr ) ) ;
addr . sin_family = AF_INET ;
addr . sin_port = htons ( s_nProbePort [ 1 ] ) ;
addr . sin_addr . S_un . S_addr = _inet_addr ( s_szProbeIP [ 1 ] ) ;
pivot = timeGetTime ( ) ;
int senbytes = sendto ( hUDP , _msg , 3 , 0 , ( struct sockaddr * ) & addr , sizeof ( addr ) ) ;
// if (senbytes == -1)
// _TRACE("%d\n", GetLastError());
break ;
}
case 1 : {
addr . sin_family = AF_INET ;
addr . sin_port = htons ( s_nProbePort [ 0 ] ) ;
addr . sin_addr . S_un . S_addr = _inet_addr ( s_szProbeIP [ 0 ] ) ;
for ( int i = 0 ; i < 3 ; i + + )
{
SOCKET hSocket = CreateTCPSocket ( 0 ) ;
if ( connect ( hSocket , ( struct sockaddr * ) & addr , sizeof ( addr ) ) ! = SOCKET_ERROR )
{
unsigned short k [ 2 ] ;
k [ 0 ] = udpport ;
k [ 1 ] = ( rand ( ) & 1 ) ? k [ 0 ] - 9321 : k [ 0 ] - 1110 ;
send ( hSocket , ( char * ) & k , 4 , 0 ) ;
state = 1 ;
closesocket ( hSocket ) ;
}
// Sleep(50);
}
break ;
}
}
tm . tv_sec = 1 ;
tm . tv_usec = 0 ;
FD_ZERO ( & fdset ) ;
FD_SET ( hUDP , & fdset ) ;
if ( select ( FD_SETSIZE , ( fd_set * ) & fdset , ( fd_set * ) 0 , ( fd_set * ) 0 , & tm ) ! = SOCKET_ERROR )
{
if ( fdset . fd_count = = 0 ) // timeout
continue ;
addrlen = sizeof ( addr ) ;
readbytes = recvfrom ( hUDP , buffer , sizeof ( buffer ) , 0 , ( struct sockaddr * ) & addr , & addrlen ) ;
// if (readbytes == -1)
// _TRACE("%d\n", GetLastError());
switch ( state )
{
case 0 :
if ( readbytes = = 12 )
{
cnt = 0 ;
struct _RETURN_UDP_ADDR
{
unsigned short port [ 2 ] ;
unsigned long addr [ 2 ] ;
} * _udp_detect = ( _RETURN_UDP_ADDR * ) buffer ;
if ( _udp_detect - > port [ 0 ] = = _udp_detect - > port [ 1 ] & &
_udp_detect - > addr [ 0 ] = = _udp_detect - > addr [ 1 ] )
{
udpport = _udp_detect - > port [ 0 ] ;
pingtotal + = ( timeGetTime ( ) - pivot ) ;
pingtest + + ;
if ( pingtest > = PING_TEST_COUNT )
state = 1 ;
Sleep ( 10 ) ;
}
}
break ;
case 1 :
if ( readbytes = = 3 & & ! memcmp ( buffer , " OTL " , 3 ) )
{
s_bNetOpen = true ;
state = 2 ;
}
break ;
}
}
}
closesocket ( hUDP ) ;
int pingtick = ( pingtotal + PING_TEST_COUNT - 1 ) / PING_TEST_COUNT ; // <20> ø<EFBFBD>
static int s_iPingCount = pingtick ;
return 0 ;
}
SOCKET CClientSessionManager : : CreateUDPSocket ( int port )
{
SOCKET s ;
SOCKADDR_IN addr ;
s = socket ( AF_INET , SOCK_DGRAM , IPPROTO_UDP ) ;
if ( s = = INVALID_SOCKET )
return false ;
memset ( & addr , 0 , sizeof ( addr ) ) ;
addr . sin_family = AF_INET ;
addr . sin_port = htons ( port ) ;
addr . sin_addr . s_addr = INADDR_ANY ;
if ( : : bind ( s , ( struct sockaddr * ) & addr , sizeof ( addr ) ) = = SOCKET_ERROR )
{
closesocket ( s ) ;
return INVALID_SOCKET ;
}
DWORD dwMode = 1 ;
: : ioctlsocket ( s , FIONBIO , & dwMode ) ;
return s ;
}
SOCKET CClientSessionManager : : CreateTCPSocket ( int port )
{
SOCKET s = socket ( AF_INET , SOCK_STREAM , IPPROTO_TCP ) ;
if ( s = = INVALID_SOCKET )
return INVALID_SOCKET ;
SOCKADDR_IN addr ;
ZeroMemory ( & addr , sizeof ( addr ) ) ;
addr . sin_family = AF_INET ;
addr . sin_port = htons ( port ) ;
addr . sin_addr . S_un . S_addr = htonl ( INADDR_ANY ) ;
if ( : : bind ( s , ( struct sockaddr * ) & addr , sizeof ( addr ) ) = = SOCKET_ERROR )
{
closesocket ( s ) ;
return INVALID_SOCKET ;
}
return s ;
}
bool CClientSessionManager : : IsPeerConnected ( unsigned int iUID )
{
std : : vector < _PEER > : : iterator ii ;
for ( ii = m_UDPPeerList . begin ( ) ; ii ! = m_UDPPeerList . end ( ) ; ii + + )
if ( ( * ii ) . iUID = = iUID )
return true ;
return false ;
}
void CClientSessionManager : : AddPeer ( unsigned long iAddr , unsigned short iPort , unsigned int iUID )
{
_PEER _peer ;
memset ( & _peer , 0 , sizeof ( _PEER ) ) ;
for ( int i = 0 ; i < sizeof ( _peer . addr . ip ) / sizeof ( * _peer . addr . ip ) ; i + + )
_peer . addr . ip [ i ] = ( ( unsigned char * ) & iAddr ) [ i ] ;
_peer . addr . port = iPort ;
_peer . iUID = iUID ;
m_UDPPeerList . push_back ( _peer ) ;
}
void CClientSessionManager : : RemovePeer ( unsigned int iUID )
{
std : : vector < _PEER > : : iterator ii ;
for ( ii = m_UDPPeerList . begin ( ) ; ii ! = m_UDPPeerList . end ( ) ; ii + + )
{
if ( ( * ii ) . iUID = = iUID )
{
m_UDPPeerList . erase ( ii ) ;
return ;
}
}
# ifdef _DEBUG
_ASSERT ( 0 ) ;
# endif
}
void CClientSessionManager : : CheckPeerPing ( )
{
if ( m_pUDPSocket = = NULL ) return ;
static unsigned long s_nLastTick = 0 ;
unsigned long nCurTick = timeGetTime ( ) ;
if ( s_nLastTick = = 0 ) s_nLastTick = nCurTick ;
if ( s_nLastTick ! = 0 & & nCurTick - s_nLastTick > 500 )
{
std : : vector < UINT > vDisconList ;
std : : vector < _PEER > : : iterator ii ;
for ( ii = m_UDPPeerList . begin ( ) ; ii ! = m_UDPPeerList . end ( ) ; ii + + )
{
int cnt = ( * ii ) . nSeq + + & 31 ;
( * ii ) . Ping [ cnt ] . nSendTick = nCurTick ;
( * ii ) . Ping [ cnt ] . nPing = 0 ;
UDPSendPacket ( CS_SYSTEM , eSystem : : CC_PEER_PING , ( char * ) & cnt , sizeof ( cnt ) , _inet_addr ( ( * ii ) . addr . ip ) , ( * ii ) . addr . port ) ;
//<2F> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> ѹ<EFBFBD> <D1B9> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> ´ µ<C2B4> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ȯ<> <C8AE> <20> մϴ<D5B4> .
//<2F> 뷫 0.5<EFBFBD> ʿ<EFBFBD> <20> ѹ<EFBFBD> <D1B9> <EFBFBD> ping<6E> <67> <20> <> <EFBFBD> Ƿ<EFBFBD> 32<33> <32> <EFBFBD> <EFBFBD> Ʈ<> <C6AE> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> µ<EFBFBD> 16<31> ʰ<EFBFBD> <20> ɸ<EFBFBD> <C9B8> ϴ<EFBFBD> . <20> 뷫 <20> <> 8<> ʿ<EFBFBD> <20> ѹ<EFBFBD> <D1B9> <EFBFBD> üŷ<C3BC> <C5B7> <20> ϴ°<CFB4> <20> <> <EFBFBD> ڽ<EFBFBD> <DABD> ϴ<EFBFBD> .
//<2F> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> 16<31> ʸ<EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> 16<31> <36> <20> <> <EFBFBD> <EFBFBD> <20> ε<EFBFBD> <CEB5> <EFBFBD> Ÿ<EFBFBD> <C5B8> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> Ʈ<EFBFBD> <C6AE> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <20> Ǿ<C7BE> <EEB8AE> Ʈ<EFBFBD> <C6AE> <EFBFBD> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> .
//rudpserver<65> <72> <EFBFBD> <EFBFBD> <20> ˷<EFBFBD> <CBB7> <EFBFBD> <20> <EFBFBD> <DEBC> <EFBFBD> <EFBFBD> <EFBFBD> server<65> <72> <20> <> <EFBFBD> <EFBFBD> <20> ߰<EFBFBD> <20> ϵ<EFBFBD> <CFB5> <EFBFBD> <20> <> <EFBFBD> <EFBFBD> <EFBFBD> մϴ<D5B4> .
bool bFlag = false ;
if ( cnt % 16 = = 0 )
{
for ( int i = 0 ; i < sizeof ( ( * ii ) . Ping ) / sizeof ( * ( * ii ) . Ping ) | | bFlag = = false ; i + + )
bFlag = ( * ii ) . Ping [ i ] . nPing ! = 0 ? true : false ;
if ( bFlag = = false )
{
vDisconList . push_back ( ( * ii ) . iUID ) ;
OutputDebug ( " Peer DisConnected SID : [%d] \n " , ( * ii ) . iUID ) ;
}
}
}
for ( int i = 0 ; i < ( int ) vDisconList . size ( ) ; i + + )
{
RemovePeer ( vDisconList [ i ] ) ;
CCPeerConnectRequest packet ;
memset ( & packet , 0 , sizeof ( packet ) ) ;
packet . cState = 2 ;
packet . nSessionID [ 1 ] = vDisconList [ i ] ;
RUDPSendPacket ( CS_SYSTEM , eSystem : : CC_PEER_CONNECT_REQUEST , & packet , sizeof ( packet ) , _RELIABLE , 0 ) ;
}
s_nLastTick = nCurTick ;
}
}
void CClientSessionManager : : RemoveListener ( MessageListener * pListener )
{
std : : vector < MessageListener * > : : iterator it = m_MessageListenerArray . begin ( ) ;
for ( ; it ! = m_MessageListenerArray . end ( ) ; it + + )
{
if ( pListener = = * it )
{
m_MessageListenerArray . erase ( it ) ;
return ;
}
}
}
void CClientSessionManager : : LockProcessDispatchMessage ( bool bLock )
{
/*if( bLock ) m_ProcessDispatchLock.Lock();
else m_ProcessDispatchLock . UnLock ( ) ; */
if ( bLock ) m_ProcessSync . Lock ( ) ;
else m_ProcessSync . UnLock ( ) ;
}