Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/FICN/src/network/ConnectionManager.cc @ 380

Last change on this file since 380 was 380, checked in by scheusso, 18 years ago

problem in connectionmanager

File size: 5.7 KB
RevLine 
[173]1//
2// C++ Interface: ConnectionManager
3//
[285]4// Description: The Class ConnectionManager manages the servers conenctions to the clients.
5// each connection is provided by a new process. communication between master process and
[173]6// connection processes is provided by ...
7//
8//
[196]9// Author:  Oliver Scheuss
[173]10//
11
[285]12#include "ConnectionManager.h"
[173]13
14namespace network{
[285]15
[196]16  boost::thread_group network_threads;
[285]17
[173]18  ConnectionManager::ConnectionManager(){
19    quit=false;
[196]20    bindAddress.host = ENET_HOST_ANY;
[173]21    bindAddress.port = NETWORK_PORT;
22  }
[285]23
[230]24  ConnectionManager::ConnectionManager(int port, std::string address){
[173]25    quit=false;
[230]26    enet_address_set_host (& bindAddress, address.c_str());
[173]27    bindAddress.port = NETWORK_PORT;
28  }
[285]29
[230]30  ConnectionManager::ConnectionManager(int port, const char *address){
31    quit=false;
32    enet_address_set_host (& bindAddress, address);
33    bindAddress.port = NETWORK_PORT;
34  }
[285]35
[204]36  ENetPacket *ConnectionManager::getPacket(ENetAddress &address){
[196]37    if(!buffer.isEmpty())
[204]38      return buffer.pop(address);
[196]39    else
40        return NULL;
[173]41  }
[380]42 
43  ENetPacket *ConnectionManager::getPacket(int &clientID){
44    ENetAddress address;
45    ENetPacket *packet=getPacket(address);
46    clientID=clientMap.find(address)->second;
47    return packet;
48  }
[285]49
[196]50  bool ConnectionManager::queueEmpty(){
51    return buffer.isEmpty();
[173]52  }
[285]53
[196]54  void ConnectionManager::createListener(){
55    network_threads.create_thread(boost::bind(boost::mem_fn(&ConnectionManager::receiverThread), this));
56//     boost::thread thr(boost::bind(boost::mem_fn(&ConnectionManager::receiverThread), this));
57    return;
58  }
[285]59
[196]60  bool ConnectionManager::quitListener(){
[173]61    quit=true;
[196]62    network_threads.join_all();
[173]63    return true;
64  }
[285]65
[196]66  bool ConnectionManager::addPacket(ENetPacket *packet, ENetPeer *peer){
[380]67    if(clientVector.size()==0)
[196]68      return false;
[380]69    if(enet_peer_send(peer, clientMap.find(peer->address)->second , packet)!=0)
[196]70      return false;
71    return true;
72  }
[380]73 
74  bool ConnectionManager::addPacket(ENetPacket *packet, int clientID){
75    if(clientVector.size()==0)
[196]76      return false;
[380]77    if(enet_peer_send(&(peerMap.find(clientVector[clientID])->second), clientID, packet)!=0)
[196]78      return false;
[380]79    return true;
[196]80  }
[380]81 
[196]82  bool ConnectionManager::addPacketAll(ENetPacket *packet){
[380]83    for(int i=0; i<clientVector.size(); i++){
84      if(enet_peer_send(&(peerMap.find(clientVector[i])->second), i, packet)!=0)
[196]85         return false;
86    }
87    return true;
88  }
[285]89
[196]90  bool ConnectionManager::sendPackets(ENetEvent *event){
91    if(server==NULL)
92      return false;
93    if(enet_host_service(server, event, NETWORK_SEND_WAIT)>=0)
94      return true;
[285]95    else
[196]96      return false;
97  }
[369]98 
99  bool ConnectionManager::sendPackets(){
100    ENetEvent event;
101    if(server==NULL)
102      return false;
103    if(enet_host_service(server, &event, NETWORK_SEND_WAIT)>=0)
104      return true;
105    else
106      return false;
107  }
[285]108
[196]109  void ConnectionManager::receiverThread(){
110    // what about some error-handling here ?
111    enet_initialize();
112    atexit(enet_deinitialize);
[173]113    ENetEvent event;
114    server = enet_host_create(&bindAddress, NETWORK_MAX_CONNECTIONS, 0, 0);
[369]115    if(server==NULL){
[173]116      // add some error handling here ==========================
117      quit=true;
[369]118      return;
119    }
[285]120
[173]121    while(!quit){
122      if(enet_host_service(server, &event, NETWORK_WAIT_TIMEOUT)<0){
123        // we should never reach this point
124        quit=true;
125        // add some error handling here ========================
126      }
127      switch(event.type){
128        // log handling ================
[196]129        case ENET_EVENT_TYPE_CONNECT:
130        addClient(&event);
[173]131        break;
[196]132      case ENET_EVENT_TYPE_RECEIVE:
133        processData(&event);
[173]134        break;
[196]135      case ENET_EVENT_TYPE_DISCONNECT:
[173]136        // add some error/log handling here
137        clientDisconnect(event.peer);
138        break;
[352]139      case ENET_EVENT_TYPE_NONE:
140        break;
[173]141      }
142    }
[369]143    disconnectClients();
[173]144    // if we're finishied, destroy server
145    enet_host_destroy(server);
146  }
[369]147 
148  void ConnectionManager::disconnectClients(){
149    bool disconnected=false;
150    ENetEvent event;
[380]151    for(int i=0; i<clientVector.size(); i++){
152      enet_peer_disconnect(&(peerMap.find(clientVector[i])->second), 0);
[369]153      while( !disconnected && enet_host_service(server, &event, NETWORK_WAIT_TIMEOUT) > 0){
154        switch (event.type)
155        {
156          case ENET_EVENT_TYPE_NONE:
157          case ENET_EVENT_TYPE_CONNECT:
158          case ENET_EVENT_TYPE_RECEIVE:
159            enet_packet_destroy(event.packet);
160            break;
161          case ENET_EVENT_TYPE_DISCONNECT:
162            disconnected=true;
163            break;
164        }
165      }
166      disconnected=false;
167    }
168    return;
169  }
[285]170
[196]171  bool ConnectionManager::processData(ENetEvent *event){
172    // just add packet to the buffer
173    // this can be extended with some preprocessing
[204]174    return buffer.push(event);
[173]175  }
[285]176
[196]177  bool ConnectionManager::clientDisconnect(ENetPeer *peer){
[380]178    return clientDisconnect(*peer);
[173]179  }
[380]180 
181  bool ConnectionManager::clientDisconnect(ENetPeer peer){
182    std::map<ENetAddress, int>::iterator it;
183    it=clientMap.find(peer.address);
184    clientVector.erase(clientVector.begin()+it->second);
185    clientMap.erase(it);
186    peerMap.erase(peerMap.find(peer.address));
187    return true;
188  }
[285]189
[196]190  bool ConnectionManager::addClient(ENetEvent *event){
[380]191    clientVector.push_back((event->peer->address));
192    clientMap[event->peer->address]=clientVector.size()-1;
193    peerMap[event->peer->address]=*(event->peer);
[173]194    return true;
195  }
[380]196 
197  int ConnectionManager::getClientID(ENetPeer peer){
198    return clientMap.find(peer.address)->second;
199  }
200 
201  int ConnectionManager::getClientID(ENetAddress address){
202    return clientMap.find(address)->second;
203  }
204 
205  ENetPeer ConnectionManager::getClientPeer(int clientID){
206    return peerMap.find(clientVector[clientID])->second;
207  }
208 
[173]209}
Note: See TracBrowser for help on using the repository browser.