// this에 연결된 모든 클라이언트 커넥션들의 패킷을 process()한다. BOOL XESocketClientInServer::Process() { XAUTO_LOCK; // 연결 끊김을 감지 ProcessConnect(); // 패킷처리 XENetworkConnection::xtError err = XENetworkConnection::xERR_NOERROR; static XPacket p(true); // heap영역을 쓰려고 이렇게 한듯? // 접속끊어졌어도 클라에선 남아있는 패킷 다 처리해야함. if( PumpPacket( &p, &err ) ){ // 암호화된 아카이브면 해독한다. if( GetbEncryption() ) p.DoDecrypto( this ); DWORD idPacket; p >> idPacket; ID idKey; // 패킷 고유 키값 p >> idKey; if( ProcessReservedPacket( idPacket, idKey, p ) == FALSE ) { p._SetidPacket( idPacket ); if( ProcessPacket( idPacket, idKey, p ) == FALSE ) { // virtual call // 패킷 처리에 실패함. 접속 끊어야 함. return FALSE; } } p.Clear(); } else { if( err != XENetworkConnection::xERR_NOERROR ) {
/////////////////////////////////////////////////////////////// // // CDatabaseJobQueueImpl::ProcessCommand // // // /////////////////////////////////////////////////////////////// void CDatabaseJobQueueImpl::ProcessCommand ( CDbJobData* pJobData ) { if ( pJobData->command.type == EJobCommand::CONNECT ) ProcessConnect ( pJobData ); else if ( pJobData->command.type == EJobCommand::DISCONNECT ) ProcessDisconnect ( pJobData ); else if ( pJobData->command.type == EJobCommand::QUERY ) ProcessQuery ( pJobData ); else if ( pJobData->command.type == EJobCommand::FLUSH ) ProcessFlush ( pJobData ); else if ( pJobData->command.type == EJobCommand::SETLOGLEVEL ) ProcessSetLogLevel ( pJobData ); }