int NetPacket::ProcessRequest(struct payload_req *req, char *buf) { printf("%s\n", __func__); switch (req->type & 0xFF000000) { case REQ_TYPE_HEARTBEAT: return ProcessHeartBeat(req, buf); break; case REQ_TYPE_RUNNING: return ProcessRunning(req, buf); break; case REQ_TYPE_MANUFACTURE: return ProcessMannufacture(req, buf); break; case REQ_TYPE_HW_DEBUG: break; case REQ_TYPE_SW_DEBUG: break; case REQ_TYPE_IMAGE: return ProcessImage(req, buf); break; default: break; } return -1; }
void C2CAN::Process() { unsigned long len; printf("Entering C2CAN::Process()\n"); RxUDPSocket ob2CANRxSockRx(m_sIP, 1218, 0); while (QueryEndThread() == false) { len = sizeof(m_ucRx); len = ob2CANRxSockRx.Receive((char*)m_ucRx, len); STo2CAN_RxCANPacket * pPack = (STo2CAN_RxCANPacket * )m_ucRx; unsigned short int header = pPack->iSig; //::Swap(header); if(len == 0) { } else if(len != sizeof(STo2CAN_RxCANPacket)) { m_ulBadFrame++; } else if(header != SIG_RX_CAN_FRAMES) { m_ulBadFrame++; } else { STo2CAN_RxCANPacket *pSTo2CAN_RxCANPacket = (STo2CAN_RxCANPacket * )m_ucRx; //Swap(*pSTo2CAN_RxCANPacket); if(CheckSum((unsigned short*)m_ucRx,sizeof(STo2CAN_RxCANPacket))) { m_ulBadFrame++; } else { // CRITICAL_REGION(m_SemRxFrames); EnterCriticalSection(&m_SemRxFrames); m_RxFrames.push_back(pSTo2CAN_RxCANPacket->CANFrames[0]); LeaveCriticalSection(&m_SemRxFrames); // END_REGION; } } ProcessHeartBeat(); Sleep(1); } printf("Leaving C2CAN::Process()\n"); }
/** @brief */ void XEWinConnectionInServer::Process( void ) { XPROF_OBJ_AUTO(); // XWinSocketSvr::Process()에서 커넥션별로 락걸어서 들어오고 있음. // XLOCK_OBJ; // 소켓이 끊어졌으면 더이상 돌필요 없다. // if( m_Socket == 0 ) // // return; // 쌓인 패킷 다 뽑아낼때까지 락걸어두자 패킷 계속오면 계속 못빠져나올수도... if( !GetbDestroy() ) { // 만약 커넥션 프로세스도 멀티스레드에서 돌아가면 이거 전체를 락걸어야 한다. // 자동연결해제 옵션이 있으면 허트비트 처리 if( GetbAutoDisconnect() ) { XPROF_OBJ("ProcessHeartBeat"); ProcessHeartBeat(); } ////////////////////////////////////////////////////////////////////////// { XPROF_OBJ( "PumpPacket" ); XENetworkConnection::xtError err = XENetworkConnection::xERR_NOERROR; XPacket p( true ); // while( PumpPacket( &p ) ) { // 패킷 한번만 뽑고 넘어감. auto bPump = PumpPacket( &p, &err ); if( bPump ) { XPROF_OBJ( "ProcessPacket" ); #ifdef _XCRYPT_PACKET BOOL bOk = FALSE; if( m_pSocketSvr->GetbEncryption() ) { bOk = p.DoDecrypto( m_pSocketSvr ); } #endif DWORD idPacket; p >> idPacket; ID idKey; p >> idKey; // 예약된 패킷 처리 if( idPacket == XE::xXEPK_RESPONSE_HB ) { #ifdef _DEBUG // CONSOLE("recv heart beat"); #endif // 응답이 왔으므로 다시 대기상태로... m_timerHeartBeat.Off(); m_modeHeartBeat = xHB_READY; } else { p._SetidPacket( idPacket ); BOOL result = ProcessPacket( idPacket, idKey, p ); if( result == FALSE ) { // virtual call // 패킷 처리에 실패함. 접속 끊어야 함. // 일단 커넥션만 끊음. DoDisconnect(); // break; } } p.Clear(); } else { if( err != XENetworkConnection::xERR_NOERROR ) { CONSOLE( "%s:PumpPacket실패:ip=%s", __TFUNC__, m_szIP ); } } } } // bDestroy