Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 7659 in orxonox.OLD for branches/network


Ignore:
Timestamp:
May 17, 2006, 11:07:53 PM (19 years ago)
Author:
rennerc
Message:

fixed bug

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/network/src/lib/network/network_stream.cc

    r7631 r7659  
    581581      continue;
    582582
    583     packetLength = peer->second.socket->readPacket( buf, UDP_PACKET_SIZE );
    584 
    585     if ( packetLength < 4*INTSIZE )
    586     {
    587       if ( packetLength != 0 )
    588         PRINTF(1)("got too small packet: %d\n", packetLength);
    589       continue;
    590     }
    591    
    592     assert( Converter::byteArrayToInt( buf, &length ) == INTSIZE );
    593     assert( Converter::byteArrayToInt( buf + INTSIZE, &state ) == INTSIZE );
    594     assert( Converter::byteArrayToInt( buf + 2*INTSIZE, &fromState ) == INTSIZE );
    595     assert( Converter::byteArrayToInt( buf + 3*INTSIZE, &ackedState ) == INTSIZE );
    596     offset = 4*INTSIZE;
    597 
    598     PRINTF(0)("got packet: %d, %d\n", length, packetLength);
     583    while ( packetLength = peer->second.socket->readPacket( buf, UDP_PACKET_SIZE ) > 0 )
     584    {
     585
     586      if ( packetLength < 4*INTSIZE )
     587      {
     588        if ( packetLength != 0 )
     589          PRINTF(1)("got too small packet: %d\n", packetLength);
     590        continue;
     591      }
     592   
     593      assert( Converter::byteArrayToInt( buf, &length ) == INTSIZE );
     594      assert( Converter::byteArrayToInt( buf + INTSIZE, &state ) == INTSIZE );
     595      assert( Converter::byteArrayToInt( buf + 2*INTSIZE, &fromState ) == INTSIZE );
     596      assert( Converter::byteArrayToInt( buf + 3*INTSIZE, &ackedState ) == INTSIZE );
     597      offset = 4*INTSIZE;
     598
     599      PRINTF(0)("got packet: %d, %d\n", length, packetLength);
    599600   
    600601    //if this is an old state drop it
    601     if ( state <= peer->second.lastRecvedState )
    602       continue;
    603    
    604     if ( packetLength != length )
    605     {
    606       PRINTF(1)("real packet length (%d) and transmitted packet length (%d) do not match!\n", packetLength, length);
    607       peer->second.socket->disconnectServer();
    608       continue;
    609     }
    610 
    611     while ( offset < length )
    612     {
    613       assert( Converter::byteArrayToInt( buf + offset, &uniqueId ) == INTSIZE );
    614       offset += INTSIZE;
    615      
    616       assert( Converter::byteArrayToInt( buf + offset, &syncDataLength ) == INTSIZE );
    617       offset += INTSIZE;
    618      
    619       Synchronizeable * sync = NULL;
    620      
    621       for ( SynchronizeableList::iterator it = synchronizeables.begin(); it != synchronizeables.end(); it++ )
    622       {
     602      if ( state <= peer->second.lastRecvedState )
     603        continue;
     604   
     605      if ( packetLength != length )
     606      {
     607        PRINTF(1)("real packet length (%d) and transmitted packet length (%d) do not match!\n", packetLength, length);
     608        peer->second.socket->disconnectServer();
     609        continue;
     610      }
     611
     612      while ( offset < length )
     613      {
     614        assert( Converter::byteArrayToInt( buf + offset, &uniqueId ) == INTSIZE );
     615        offset += INTSIZE;
     616     
     617        assert( Converter::byteArrayToInt( buf + offset, &syncDataLength ) == INTSIZE );
     618        offset += INTSIZE;
     619     
     620        Synchronizeable * sync = NULL;
     621     
     622        for ( SynchronizeableList::iterator it = synchronizeables.begin(); it != synchronizeables.end(); it++ )
     623        {
    623624        //                                        client thinks his handshake has id 0!!!!!
    624         if ( (*it)->getUniqueID() == uniqueId || ( uniqueId == 0 && (*it)->getUniqueID() == peer->second.userId ) )
    625         {
    626           sync = *it;
    627           break;
    628         }
    629       }
    630      
    631       if ( sync == NULL )
    632       {
    633         if ( oldSynchronizeables.find( uniqueId ) != oldSynchronizeables.end() )
    634         {
    635           offset += syncDataLength;
    636           continue;
    637         }
     625          if ( (*it)->getUniqueID() == uniqueId || ( uniqueId == 0 && (*it)->getUniqueID() == peer->second.userId ) )
     626          {
     627            sync = *it;
     628            break;
     629          }
     630        }
     631     
     632        if ( sync == NULL )
     633        {
     634          if ( oldSynchronizeables.find( uniqueId ) != oldSynchronizeables.end() )
     635          {
     636            offset += syncDataLength;
     637            continue;
     638          }
    638639       
    639640        //TODO dont accept new object from all peers (probably only servers)
    640         int leafClassId;
    641         if ( INTSIZE > length - offset )
    642         {
    643           offset += syncDataLength;
    644           continue;
    645         }
     641          int leafClassId;
     642          if ( INTSIZE > length - offset )
     643          {
     644            offset += syncDataLength;
     645            continue;
     646          }
    646647       
    647         Converter::byteArrayToInt( buf + offset, &leafClassId );
     648          Converter::byteArrayToInt( buf + offset, &leafClassId );
    648649       
    649         BaseObject * b;
    650         /* These are some small exeptions in creation: Not all objects can/should be created via Factory */
    651         /* Exception 1: NullParent */
    652         if( leafClassId == CL_NULL_PARENT || leafClassId == CL_SYNCHRONIZEABLE )
    653         {
    654           PRINTF(1)("Can not create Class with ID %x!\n", (int)leafClassId);
    655           offset += syncDataLength;
    656           continue;
    657         }
    658         else
    659           b = Factory::fabricate( (ClassID)leafClassId );
    660 
    661         if ( !b )
    662         {
    663           PRINTF(1)("Could not fabricate Object with classID %x\n", leafClassId);
    664           offset += syncDataLength;
    665           continue;
    666         }
     650          BaseObject * b;
     651          /* These are some small exeptions in creation: Not all objects can/should be created via Factory */
     652          /* Exception 1: NullParent */
     653          if( leafClassId == CL_NULL_PARENT || leafClassId == CL_SYNCHRONIZEABLE )
     654          {
     655            PRINTF(1)("Can not create Class with ID %x!\n", (int)leafClassId);
     656            offset += syncDataLength;
     657            continue;
     658          }
     659          else
     660            b = Factory::fabricate( (ClassID)leafClassId );
     661
     662          if ( !b )
     663          {
     664            PRINTF(1)("Could not fabricate Object with classID %x\n", leafClassId);
     665            offset += syncDataLength;
     666            continue;
     667          }
    667668       
    668         if ( b->isA(CL_SYNCHRONIZEABLE) )
    669         {
    670           sync = dynamic_cast<Synchronizeable*>(b);
    671           sync->setUniqueID( uniqueId );
    672           sync->setSynchronized(true);
    673  
    674           PRINTF(0)("Fabricated %s with id %d\n", sync->getClassName(), sync->getUniqueID());
    675         }
    676         else
    677         {
    678           PRINTF(1)("Class with ID %x is not a synchronizeable!\n", (int)leafClassId);
    679           delete b;
    680           offset += syncDataLength;
    681           continue;
    682         }
     669          if ( b->isA(CL_SYNCHRONIZEABLE) )
     670          {
     671            sync = dynamic_cast<Synchronizeable*>(b);
     672            sync->setUniqueID( uniqueId );
     673            sync->setSynchronized(true);
     674 
     675            PRINTF(0)("Fabricated %s with id %d\n", sync->getClassName(), sync->getUniqueID());
     676          }
     677          else
     678          {
     679            PRINTF(1)("Class with ID %x is not a synchronizeable!\n", (int)leafClassId);
     680            delete b;
     681            offset += syncDataLength;
     682            continue;
     683          }
     684        }
     685
     686        offset += sync->setStateDiff( peer->second.userId, buf+offset, length-offset, state, fromState );
    683687      }
    684 
    685       offset += sync->setStateDiff( peer->second.userId, buf+offset, length-offset, state, fromState );
    686     }
    687    
    688     if ( offset != length )
    689     {
    690       peer->second.socket->disconnectServer();
    691     }
    692    
    693     peer->second.lastAckedState = ackedState;
    694   }
    695  
    696 }
    697 
    698 
    699 
    700 
    701 
    702 
     688   
     689      if ( offset != length )
     690      {
     691        peer->second.socket->disconnectServer();
     692      }
     693   
     694      peer->second.lastAckedState = ackedState;
     695    }
     696 
     697  }
     698 
     699}
     700
     701
     702
     703
     704
     705
Note: See TracChangeset for help on using the changeset viewer.