Changeset 2759 for code/trunk/src/network
- Timestamp:
- Mar 8, 2009, 4:51:27 PM (16 years ago)
- Location:
- code/trunk/src/network
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/network/ConnectionManager.cc
r2662 r2759 46 46 #include <boost/bind.hpp> 47 47 48 #include "core/CoreIncludes.h"49 #include "core/BaseObject.h"50 #include "core/Iterator.h"51 48 #include "util/Math.h" 52 49 #include "util/Sleep.h" … … 124 121 void ConnectionManager::createListener() { 125 122 receiverThread_ = new boost::thread(boost::bind(&ConnectionManager::receiverThread, this)); 126 //network_threads.create_thread(boost::bind(boost::mem_fn(&ConnectionManager::receiverThread), this));127 //boost::thread thr(boost::bind(boost::mem_fn(&ConnectionManager::receiverThread), this));128 123 return; 129 124 } … … 131 126 bool ConnectionManager::quitListener() { 132 127 quit=true; 133 //network_threads.join_all();134 128 receiverThread_->join(); 135 129 return true; … … 206 200 // log handling ================ 207 201 case ENET_EVENT_TYPE_CONNECT: 208 //COUT(3) << "adding event_type_connect to queue" << std::endl;209 202 case ENET_EVENT_TYPE_DISCONNECT: 210 //addClient(event);211 //this is a workaround to ensure thread safety212 //COUT(5) << "Con.Man: connection event has occured" << std::endl;213 //break;214 203 case ENET_EVENT_TYPE_RECEIVE: 215 //std::cout << "received data" << std::endl;216 //COUT(5) << "Con.Man: receive event has occured" << std::endl;217 // only add, if client has connected yet and not been disconnected218 //if(head_->findClient(&event->peer->address))219 204 processData(event); 220 205 event = new ENetEvent; 221 // else222 // COUT(3) << "received a packet from a client we don't know" << std::endl;223 206 break; 224 //case ENET_EVENT_TYPE_DISCONNECT:225 //clientDisconnect(event->peer);226 //break;227 207 case ENET_EVENT_TYPE_NONE: 228 208 //receiverThread_->yield(); … … 299 279 } 300 280 301 /** 302 * 303 * @param clientID 304 */ 281 305 282 void ConnectionManager::syncClassid(unsigned int clientID) { 306 unsigned int network_id=0, failures=0; 307 std::string classname; 308 Identifier *id; 309 std::map<std::string, Identifier*>::const_iterator it = Factory::getFactoryMapBegin(); 310 while(it != Factory::getFactoryMapEnd()){ 311 id = (*it).second; 312 if(id == NULL) 313 continue; 314 classname = id->getName(); 315 network_id = id->getNetworkID(); 316 if(network_id==0) 317 COUT(3) << "we got a null class id: " << id->getName() << std::endl; 318 COUT(4) << "Con.Man:syncClassid:\tnetwork_id: " << network_id << ", classname: " << classname << std::endl; 319 320 packet::ClassID *classid = new packet::ClassID( network_id, classname ); 321 classid->setClientID(clientID); 322 while(!classid->send() && failures < 10){ 323 failures++; 324 } 325 ++it; 326 } 327 //sendPackets(); 283 int failures=0; 284 packet::ClassID *classid = new packet::ClassID(); 285 classid->setClientID(clientID); 286 while(!classid->send() && failures < 10){ 287 failures++; 288 } 289 assert(failures<10); 328 290 COUT(4) << "syncClassid:\tall synchClassID packets have been sent" << std::endl; 329 291 } 330 292 331 293 332 294 void ConnectionManager::disconnectClient(ClientInformation *client){ -
code/trunk/src/network/ConnectionManager.h
r2756 r2759 80 80 static boost::recursive_mutex enet_mutex; 81 81 ConnectionManager(); 82 //ConnectionManager(ClientInformation *head);83 82 ConnectionManager(int port); 84 83 ConnectionManager(int port, const char *address); 85 84 ConnectionManager(int port, const std::string& address); 86 85 ~ConnectionManager(); 87 //ENetPacket *getPacket(ENetAddress &address); // thread188 //ENetPacket *getPacket(int &clientID);89 86 ENetEvent *getEvent(); 90 87 bool queueEmpty(); 91 88 void createListener(); 92 89 bool quitListener(); 93 // bool addPacket(Packet::Packet *packet);94 90 static bool addPacket(ENetPacket *packet, ENetPeer *peer); 95 91 static bool addPacket(ENetPacket *packet, int ID); 96 92 static bool addPacketAll(ENetPacket *packet); 97 // bool sendPackets(ENetEvent *event);98 93 bool sendPackets(); 99 //bool createClient(int clientID);100 94 void disconnectClient(ClientInformation *client); 101 95 void syncClassid(unsigned int clientID); 102 96 103 97 private: 104 // bool clientDisconnect(ENetPeer *peer);105 // bool removeClient(int clientID);106 98 bool processData(ENetEvent *event); 107 //bool addClient(ENetEvent *event);108 99 void receiverThread(); 109 100 void disconnectClients(); -
code/trunk/src/network/packet/ClassID.cc
r2669 r2759 31 31 #include "ClassID.h" 32 32 #include "core/CoreIncludes.h" 33 #include "core/Factory.h" 33 34 #include <cstring> 35 #include <string> 34 36 #include <assert.h> 37 #include <map> 38 #include <queue> 35 39 36 40 namespace orxonox { … … 38 42 39 43 44 #define PACKET_FLAGS_CLASSID ENET_PACKET_FLAG_RELIABLE 45 #define _PACKETID 0 40 46 41 ClassID::ClassID( unsigned int classID, std::string className ) 42 : Packet() 43 { 47 48 ClassID::ClassID( ) : Packet(){ 49 Identifier *id; 50 std::string classname; 51 unsigned int nrOfClasses=0; 52 unsigned int packetSize=2*sizeof(uint32_t); //space for the packetID and for the nrofclasses 53 uint32_t network_id; 44 54 flags_ = flags_ | PACKET_FLAGS_CLASSID; 45 classNameLength_=className.length()+1; 46 assert(getSize()); 47 data_=new unsigned char[ getSize() ]; 48 assert(data_); 49 *(ENUM::Type *)(data_ + _PACKETID ) = ENUM::ClassID; 50 *(unsigned int *)(data_ + _CLASSID ) = classID; 51 *(unsigned int *)(data_ + _CLASSNAMELENGTH ) = classNameLength_; 52 memcpy( data_+_CLASSNAME, (void *)className.c_str(), classNameLength_ ); 55 std::queue<std::pair<uint32_t, std::string> > tempQueue; 56 57 //calculate total needed size (for all strings and integers) 58 std::map<std::string, Identifier*>::const_iterator it = Factory::getFactoryMapBegin(); 59 for(;it != Factory::getFactoryMapEnd();++it){ 60 id = (*it).second; 61 if(id == NULL) 62 continue; 63 classname = id->getName(); 64 network_id = id->getNetworkID(); 65 if(network_id==0) 66 COUT(3) << "we got a null class id: " << id->getName() << std::endl; 67 // now push the network id and the classname to the stack 68 tempQueue.push( std::pair<unsigned int, std::string>(network_id, classname) ); 69 ++nrOfClasses; 70 packetSize += (classname.size()+1)+sizeof(uint32_t)+sizeof(uint32_t); 71 } 72 73 this->data_=new uint8_t[ packetSize ]; 74 //set the appropriate packet id 75 assert(this->data_); 76 *(ENUM::Type *)(this->data_ + _PACKETID ) = ENUM::ClassID; 77 78 uint8_t *temp=data_+sizeof(uint32_t); 79 // save the number of all classes 80 *(uint32_t*)temp = nrOfClasses; 81 temp += sizeof(uint32_t); 82 83 // now save all classids and classnames 84 std::pair<uint32_t, std::string> tempPair; 85 while( !tempQueue.empty() ){ 86 tempPair = tempQueue.front(); 87 tempQueue.pop(); 88 *(uint32_t*)temp = tempPair.first; 89 *(uint32_t*)(temp+sizeof(uint32_t)) = tempPair.second.size()+1; 90 memcpy(temp+2*sizeof(uint32_t), tempPair.second.c_str(), tempPair.second.size()+1); 91 temp+=2*sizeof(uint32_t)+tempPair.second.size()+1; 92 } 93 94 COUT(0) << "classid packetSize is " << packetSize << endl; 95 53 96 } 54 97 … … 56 99 : Packet(data, clientID) 57 100 { 58 memcpy( (void *)&classNameLength_, &data[ _CLASSNAMELENGTH ], sizeof(classNameLength_) );59 101 } 60 102 … … 63 105 } 64 106 65 unsigned int ClassID::getSize() const{ 66 return sizeof(packet::ENUM::Type) + 2*sizeof(uint32_t) + classNameLength_; 107 uint32_t ClassID::getSize() const{ 108 uint8_t *temp = data_+sizeof(uint32_t); // packet identification 109 uint32_t totalsize = sizeof(uint32_t); // packet identification 110 uint32_t nrOfClasses = *(uint32_t*)temp; 111 temp += sizeof(uint32_t); 112 totalsize += sizeof(uint32_t); // storage size for nr of all classes 113 114 for(unsigned int i=0; i<nrOfClasses; i++){ 115 totalsize += 2*sizeof(uint32_t) + *(uint32_t*)(temp + sizeof(uint32_t)); 116 } 117 return totalsize; 67 118 } 68 119 120 69 121 bool ClassID::process(){ 70 COUT(3) << "processing classid: " << getClassID() << " name: " << getClassName() << std::endl; 71 Identifier *id=ClassByString( std::string(getClassName()) ); 72 if(id==NULL) 73 return false; 74 id->setNetworkID( getClassID() ); 122 int nrOfClasses; 123 uint8_t *temp = data_+sizeof(uint32_t); //skip the packetid 124 uint32_t networkID; 125 uint32_t stringsize; 126 unsigned char *classname; 127 128 129 //clean the map of network ids 130 Factory::cleanNetworkIDs(); 131 132 COUT(4) << "=== processing classids: " << endl; 133 std::pair<uint32_t, std::string> tempPair; 134 Identifier *id; 135 // read the total number of classes 136 nrOfClasses = *(uint32_t*)temp; 137 temp += sizeof(uint32_t); 138 139 for( int i=0; i<nrOfClasses; i++){ 140 networkID = *(uint32_t*)temp; 141 stringsize = *(uint32_t*)(temp+sizeof(uint32_t)); 142 classname = temp+2*sizeof(uint32_t); 143 id=ClassByString( std::string((const char*)classname) ); 144 COUT(0) << "processing classid: " << networkID << " name: " << classname << " id: " << id << std::endl; 145 if(id==NULL){ 146 COUT(0) << "Recieved a bad classname" << endl; 147 abort(); 148 } 149 id->setNetworkID( networkID ); 150 temp += 2*sizeof(uint32_t) + stringsize; 151 } 75 152 delete this; 76 153 return true; … … 78 155 79 156 80 unsigned int ClassID::getClassID(){81 return *(uint32_t *)(data_ + _CLASSID);82 }83 84 157 } //namespace packet 85 158 }//namespace orxonox -
code/trunk/src/network/packet/ClassID.h
r2669 r2759 38 38 namespace packet { 39 39 40 #define PACKET_FLAGS_CLASSID ENET_PACKET_FLAG_RELIABLE41 #define _PACKETID 042 #define _CLASSID _PACKETID + sizeof(ENUM::Type)43 #define _CLASSNAMELENGTH _CLASSID + sizeof(uint32_t)44 #define _CLASSNAME _CLASSNAMELENGTH + sizeof(classNameLength_)45 40 46 41 /** … … 50 45 { 51 46 public: 52 ClassID( unsigned int classID, std::string className);47 ClassID( ); 53 48 ClassID( uint8_t* data, unsigned int clientID ); 54 49 ~ClassID(); 55 50 56 inline unsigned int getSize() const;51 uint32_t getSize() const; 57 52 bool process(); 58 53 59 unsigned int getClassID();60 unsigned int getClassNameLength(){ return classNameLength_; }61 const char *getClassName(){ return (const char*)(data_+_CLASSNAME); }62 54 private: 63 uint32_t classNameLength_;64 55 }; 65 56 -
code/trunk/src/network/packet/Gamestate.cc
r2710 r2759 48 48 #define PACKET_FLAG_GAMESTATE ENET_PACKET_FLAG_RELIABLE 49 49 50 // Gamestate::Gamestate()51 // {52 // flags_ = flags_ | PACKET_FLAG_GAMESTATE;53 // }54 50 55 51 Gamestate::Gamestate() … … 127 123 #endif 128 124 129 //if(it->doSelection(id))130 125 if ( it->doSync( id, mode ) ) 131 126 dataMap_.push_back( obj(it->getObjectID(), it->getCreatorID(), tempsize, mem-data_) ); 132 // dataMap_[mem-data_]=(*it); // save the mem location of the synchronisable data133 127 if(!it->getData(mem, id, mode)) 134 128 return false; // mem pointer gets automatically increased because of call by reference … … 158 152 assert(!header_->isDiffed()); 159 153 uint8_t *mem=data_+GamestateHeader::getSize(); 160 // get the start of the Synchronisable list161 //ObjectList<Synchronisable>::iterator it=ObjectList<Synchronisable>::begin();162 154 Synchronisable *s; 163 155 … … 177 169 mem += objectheader.getDataSize(); 178 170 } 179 // COUT(0) << "could not fabricate synchronisable: " << objectheader->objectID << " classid: " << objectheader->classID << " creator: " << objectheader->creatorID << endl;180 // else181 // COUT(0) << "fabricated: " << objectheader->objectID << " classid: " << objectheader->classID << " creator: " << objectheader->creatorID << endl;182 171 } 183 172 else 184 173 { 185 174 bool b = s->updateData(mem, mode); 186 // if(!b)187 // COUT(0) << "data could not be updated" << endl;188 175 assert(b); 189 176 } … … 262 249 uint8_t *ndata = new uint8_t[buffer+GamestateHeader::getSize()]; 263 250 uint8_t *dest = ndata + GamestateHeader::getSize(); 264 //unsigned char *dest = new unsigned char[buffer];265 251 uint8_t *source = data_ + GamestateHeader::getSize(); 266 252 int retval; … … 294 280 uint32_t compsize = header_->getCompSize(); 295 281 uint32_t bufsize; 296 // assert(compsize<=datasize);297 282 bufsize = datasize; 298 283 assert(bufsize!=0); … … 340 325 assert(!header_->isDiffed()); 341 326 GamestateHeader diffHeader(base->data_); 342 //unsigned char *basep = base->getGs()/*, *gs = getGs()*/;343 327 uint8_t *basep = GAMESTATE_START(base->data_), *gs = GAMESTATE_START(this->data_); 344 328 uint32_t of=0; // pointers offset … … 397 381 //copy in the zeros 398 382 for(it=dataMap_.begin(); it!=dataMap_.end();){ 399 // if((*it).objSize==0)400 // continue;401 // if(it->second->getSize(HEADER->id)==0) // merged from objecthierarchy2, doesn't work anymore; TODO: change this402 // continue; // merged from objecthierarchy2, doesn't work anymore; TODO: change this403 383 SynchronisableHeader oldobjectheader(origdata); 404 384 SynchronisableHeader newobjectheader(newdata); … … 408 388 continue; 409 389 } 410 // object = Synchronisable::getSynchronisable( (*it).objID );411 // assert(object->objectID == oldobjectheader->objectID);412 390 objectsize = oldobjectheader.getDataSize(); 413 391 objectOffset=SynchronisableHeader::getSize(); //skip the size and the availableData variables in the objectheader … … 447 425 assert(header_->isDiffed()); 448 426 assert(!header_->isCompressed() && !base->header_->isCompressed()); 449 //unsigned char *basep = base->getGs()/*, *gs = getGs()*/;450 427 uint8_t *basep = GAMESTATE_START(base->data_); 451 428 uint8_t *gs = GAMESTATE_START(this->data_); -
code/trunk/src/network/packet/Gamestate.h
r2662 r2759 93 93 private: 94 94 uint8_t *data_; 95 //#define GAMESTATE_START(data) (data + sizeof(GamestateHeader))96 //#define GAMESTATE_HEADER(data) ((GamestateHeader *)data)97 //#define HEADER GAMESTATE_HEADER(data_)98 95 99 96 }; -
code/trunk/src/network/synchronisable/Synchronisable.cc
r2710 r2759 100 100 if (this->objectMode_ != 0x0 && (Host::running() && Host::isServer())) 101 101 deletedObjects_.push(objectID); 102 // COUT(3) << "destruct synchronisable +++" << objectID << " | " << classID << std::endl;103 // COUT(3) << " bump ---" << objectID << " | " << &objectMap_ << std::endl;104 // assert(objectMap_[objectID]->objectID==objectID);105 // objectMap_.erase(objectID);106 102 } 107 103 std::map<uint32_t, Synchronisable*>::iterator it; … … 110 106 objectMap_.erase(it); 111 107 112 //HACK HACK HACK HACK HACK HACK113 // this hack ensures that children of this object also get destroyed114 // ObjectList<Synchronisable>::iterator it2, it3;115 // // get total size of gamestate116 // for(it2 = ObjectList<Synchronisable>::begin(); it2; ++it2)117 // {118 // if ( it2->getCreatorID() == this->objectID && it2->getCreatorID() != OBJECTID_UNKNOWN )119 // {120 // Synchronisable::deleteObject( it2->getObjectID() );121 // }122 // }123 //HACK HACK HACK HACK HACK HACK124 108 } 125 109 … … 158 142 if (!id) 159 143 { 144 for(int i = 0; i<100; i++) 145 COUT(0) << "classid: " << i << " identifier: " << ClassByID(i) << endl; 160 146 COUT(0) << "Assertion failed: id" << std::endl; 161 147 COUT(0) << "Possible reason for this error: Client received a synchronizable object whose class has no factory." << std::endl; … … 203 189 */ 204 190 bool Synchronisable::deleteObject(uint32_t objectID){ 205 // assert(getSynchronisable(objectID));206 191 if(!getSynchronisable(objectID)) 207 192 return false; 208 193 assert(getSynchronisable(objectID)->objectID==objectID); 209 // delete objectMap_[objectID];210 194 Synchronisable *s = getSynchronisable(objectID); 211 195 if(s) … … 258 242 if(!doSync(id, mode)) 259 243 return true; 260 //std::cout << "inside getData" << std::endl;261 244 uint32_t tempsize = 0; 262 245 if (this->classID==0) … … 267 250 268 251 assert(this->classID==this->getIdentifier()->getNetworkID()); 269 // this->classID=this->getIdentifier()->getNetworkID(); // TODO: correct this270 252 std::list<SynchronisableVariableBase*>::iterator i; 271 253 uint32_t size; … … 305 287 mode=state_; 306 288 std::list<SynchronisableVariableBase *>::iterator i; 307 //assert(objectMode_!=0x0);308 //assert( (mode ^ objectMode_) != 0);309 289 if(syncList.empty()){ 310 290 assert(0); -
code/trunk/src/network/synchronisable/Synchronisable.h
r2710 r2759 142 142 protected: 143 143 Synchronisable(BaseObject* creator); 144 // void registerVariable(void *var, int size, variableType t, uint8_t mode=0x1, NetworkCallbackBase *cb=0);145 144 template <class T> void registerVariable(T& variable, uint8_t mode=0x1, NetworkCallbackBase *cb=0, bool bidirectional=false); 146 145 template <class T> void unregisterVariable(T& var); … … 205 204 template <> _NetworkExport void Synchronisable::registerVariable( const Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional); 206 205 template <> _NetworkExport void Synchronisable::registerVariable( Quaternion& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional); 207 // template <> _NetworkExport void Synchronisable::registerVariable( LODParticle::LOD& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);208 // template <> _NetworkExport void Synchronisable::registerVariable( Ogre::Light::LightTypes& variable, uint8_t mode, NetworkCallbackBase* cb, bool bidirectional);209 206 } 210 207
Note: See TracChangeset
for help on using the changeset viewer.