Changeset 1360 for code/trunk/src/network/ConnectionManager.cc
- Timestamp:
- May 22, 2008, 2:02:06 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/network/ConnectionManager.cc
r1293 r1360 101 101 ENetPacket *packet=getPacket(address); 102 102 ClientInformation *temp =head_->findClient(&address); 103 if(!temp) 104 return NULL; 103 105 clientID=temp->getID(); 104 106 return packet; … … 124 126 125 127 bool ConnectionManager::addPacket(ENetPacket *packet, ENetPeer *peer) { 126 if(enet_peer_send(peer, (enet_uint8)head_->findClient(&(peer->address))->getID() , packet)!=0) 128 ClientInformation *temp = head_->findClient(&(peer->address)); 129 if(!temp) 130 return false; 131 if(enet_peer_send(peer, (enet_uint8)temp->getID() , packet)!=0) 127 132 return false; 128 133 return true; … … 130 135 131 136 bool ConnectionManager::addPacket(ENetPacket *packet, int clientID) { 132 if(enet_peer_send(head_->findClient(clientID)->getPeer(), (enet_uint8)clientID, packet)!=0) 137 ClientInformation *temp = head_->findClient(clientID); 138 if(!temp) 139 return false; 140 if(enet_peer_send(temp->getPeer(), (enet_uint8)clientID, packet)!=0) 133 141 return false; 134 142 return true; … … 185 193 addClient(event); 186 194 //this is a workaround to ensure thread safety 187 /*if(!addFakeConnectRequest(&event))188 COUT(3) << "Problem pushing fakeconnectRequest to queue" << std::endl;*/189 195 COUT(5) << "Con.Man: connection event has occured" << std::endl; 190 196 break; … … 195 201 if(head_->findClient(&event->peer->address)) 196 202 processData(event); 203 else 204 COUT(3) << "received a packet from a client we don't know" << std::endl; 197 205 break; 198 206 case ENET_EVENT_TYPE_DISCONNECT: … … 200 208 break; 201 209 case ENET_EVENT_TYPE_NONE: 210 receiverThread_->yield(); 202 211 break; 203 212 } … … 233 242 case ENET_EVENT_TYPE_DISCONNECT: 234 243 COUT(4) << "disconnecting all clients" << std::endl; 235 delete head_->findClient(&(event.peer->address)); 244 if(head_->findClient(&(event.peer->address))) 245 delete head_->findClient(&(event.peer->address)); 236 246 //maybe needs bugfix: might also be a reason for the server to crash 237 247 temp = temp->next(); … … 259 269 bool ConnectionManager::addClient(ENetEvent *event) { 260 270 ClientInformation *temp = head_->insertBack(new ClientInformation); 261 if(temp->prev()->head) { //not good if you use anything else than insertBack 271 if(!temp){ 272 COUT(2) << "Conn.Man. could not add client" << std::endl; 273 return false; 274 } 275 if(temp->prev()->getHead()) { //not good if you use anything else than insertBack 262 276 temp->prev()->setID(0); //bugfix: not necessary but usefull 263 277 temp->setID(1); … … 266 280 temp->setID(temp->prev()->getID()+1); 267 281 temp->setPeer(event->peer); 268 COUT( 4) << "Con.Man: added client id: " << temp->getID() << std::endl;282 COUT(3) << "Con.Man: added client id: " << temp->getID() << std::endl; 269 283 return true; 270 284 } … … 283 297 284 298 void ConnectionManager::syncClassid(int clientID) { 285 unsigned int network_id=0 ;299 unsigned int network_id=0, failures=0; 286 300 std::string classname; 287 301 orxonox::Identifier *id; … … 293 307 classname = id->getName(); 294 308 network_id = id->getNetworkID(); 309 if(network_id==0) 310 COUT(3) << "we got a null class id: " << id->getName() << std::endl; 295 311 COUT(4) << "Con.Man:syncClassid:\tnetwork_id: " << network_id << ", classname: " << classname << std::endl; 296 312 297 addPacket(packet_gen.clid( (int)network_id, classname ), clientID); 298 313 while(!addPacket(packet_gen.clid( (int)network_id, classname ), clientID) && failures < 10){ 314 failures++; 315 } 299 316 ++it; 300 317 } … … 305 322 bool ConnectionManager::createClient(int clientID){ 306 323 ClientInformation *temp = head_->findClient(clientID); 324 if(!temp){ 325 COUT(2) << "Conn.Man. could not create client with id: " << clientID << std::endl; 326 return false; 327 } 307 328 COUT(4) << "Con.Man: creating client id: " << temp->getID() << std::endl; 308 329 syncClassid(temp->getID()); 309 330 COUT(4) << "creating spaceship for clientid: " << temp->getID() << std::endl; 310 331 // TODO: this is only a hack, untill we have a possibility to define default player-join actions 311 createShip(temp); 312 COUT(4) << "created spaceship" << std::endl; 332 if(!createShip(temp)) 333 COUT(2) << "Con.Man. could not create ship for clientid: " << clientID << std::endl; 334 else 335 COUT(3) << "created spaceship" << std::endl; 313 336 temp->setSynched(true); 314 COUT( 4) << "sending welcome" << std::endl;337 COUT(3) << "sending welcome" << std::endl; 315 338 sendWelcome(temp->getID(), temp->getShipID(), true); 316 339 return true; … … 319 342 bool ConnectionManager::removeClient(int clientID){ 320 343 orxonox::Iterator<orxonox::SpaceShip> it = orxonox::ObjectList<orxonox::SpaceShip>::start(); 344 ClientInformation *client = head_->findClient(clientID); 345 if(!client) 346 return false; 321 347 while(it){ 322 if(it->objectID!= head_->findClient(clientID)->getShipID()){348 if(it->objectID!=client->getShipID()){ 323 349 ++it; 324 350 continue; … … 333 359 334 360 bool ConnectionManager::createShip(ClientInformation *client){ 361 if(!client) 362 return false; 335 363 orxonox::Identifier* id = ID("SpaceShip"); 336 364 if(!id){ … … 351 379 no->setRotDamp(1.0); 352 380 no->setCamera("cam_"+client->getID()); 381 no->classID = id->getNetworkID(); 353 382 no->create(); 354 383 … … 369 398 370 399 bool ConnectionManager::sendWelcome(int clientID, int shipID, bool allowed){ 371 addPacket(packet_gen.generateWelcome(clientID, shipID, allowed),clientID); 372 sendPackets(); 373 return true; 400 if(addPacket(packet_gen.generateWelcome(clientID, shipID, allowed),clientID)){ 401 sendPackets(); 402 return true; 403 }else 404 return false; 374 405 } 375 406
Note: See TracChangeset
for help on using the changeset viewer.