00001 #include "lugre_prefix.h" 00002 #include "lugre_net.h" 00003 #include "lugre_fifo.h" 00004 #include "object.h" 00005 #include "resyncreceiver.h" 00006 00007 using namespace Lugre; 00008 00009 cResyncReceiver* gpResyncReceiver = 0; 00010 00011 cResyncReceiver::cResyncReceiver () {} 00012 cResyncReceiver::~cResyncReceiver () { if (this == gpResyncReceiver) gpResyncReceiver = 0; } 00013 00016 int cResyncReceiver::ReceiveResyncs (cUDP_ReceiveSocket& pUDPSocket,const uint32 iServerAddr) { 00017 static cFIFO myFIFO; 00018 uint32 iRemoteAddr; 00019 cObject* pObj; 00020 int res; 00021 00022 // clear fifo just to be sure in case of errors 00023 myFIFO.Clear(); 00024 00025 // receive all available packets 00026 while ((res = pUDPSocket.Receive(myFIFO,iRemoteAddr)) > 0) { 00027 if (iRemoteAddr == iServerAddr) { 00028 if (myFIFO.size() >= kResyncMessageLen) { 00029 uint32 iObjID = myFIFO.PeekUint32(0); 00030 pObj = mlObjects[iObjID]; 00031 //printf("cResyncReceiver::ReceiveResyncs objid=%d obj=0x%08x\n",iObjID,(int)pObj); 00032 if (pObj) pObj->LoadResyncData(myFIFO); else cObject::SkipResyncData(myFIFO); 00033 } else { 00034 // todo : protocol version mismatch ? broken message ? 00035 } 00036 } else { 00037 // todo : report hacking attempt to server ? 00038 } 00039 myFIFO.Clear(); 00040 } 00041 return res; 00042 } 00043 00044 void cResyncReceiver::ReceiveResyncsFromFIFO (cFIFO& pFIFO) { 00045 cObject* pObj; 00046 while (pFIFO.size() >= kResyncMessageLen) { 00047 uint32 iObjID = pFIFO.PeekUint32(0); 00048 pObj = mlObjects[iObjID]; 00049 //printf("cResyncReceiver::ReceiveResyncs objid=%d obj=0x%08x\n",iObjID,(int)pObj); 00050 if (pObj) pObj->LoadResyncData(pFIFO); else cObject::SkipResyncData(pFIFO); 00051 } 00052 }
1.5.6