Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Nov 11, 2007, 5:11:36 PM (16 years ago)
Author:
scheusso
Message:

created a dummyserver and dummyclient in order to test ConnectionManager and PacketBuffer with enet and boost_thread\n Makefile is used to build server and client

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/network/ConnectionManager.cc

    r173 r196  
    77//
    88//
    9 // Author:  Dumeni, Oli
     9// Author:  Oliver Scheuss
    1010//
    1111
    12 // enet library for networking support
    13 #include enet/enet.h
    14 // boost.thread library for multithreading support
    15 #include boost/thread/thread.hpp
    16 // headerfile
    1712#include "network/ConnectionManager.h"
    1813
    1914namespace network{
     15 
     16  boost::thread_group network_threads;
     17 
     18  void test(){
     19    return;
     20  }
     21 
    2022  ConnectionManager::ConnectionManager(){
    2123    quit=false;
    2224    client=NULL;
    23     bindAddress.host = std::ENET_HOST_ANY;
     25    bindAddress.host = ENET_HOST_ANY;
    2426    bindAddress.port = NETWORK_PORT;
    2527  }
     
    3234  }
    3335 
    34   void ConnectionManager::loop(){
    35     if(!quit && !buffer.isEmpty()){
    36       // to be implemented =================
    37      
    38     }
    39   }
    40  
    41   bool ConnectionManager::createListener(){
    42     threads.create_thread(&peerLoop);
    43     return true;
    44   }
    45  
    46   bool ConnectionManager::quitServer(){
     36 
     37  ENetPacket *ConnectionManager::getPacket(){
     38    if(!buffer.isEmpty())
     39      return buffer.pop();
     40    else
     41        return NULL;
     42  }
     43 
     44  bool ConnectionManager::queueEmpty(){
     45    return buffer.isEmpty();
     46  }
     47 
     48  void ConnectionManager::createListener(){
     49    network_threads.create_thread(boost::bind(boost::mem_fn(&ConnectionManager::receiverThread), this));
     50//     boost::thread thr(boost::bind(boost::mem_fn(&ConnectionManager::receiverThread), this));
     51    return;
     52  }
     53 
     54  bool ConnectionManager::quitListener(){
    4755    quit=true;
    48     threads.join_all();
    49     return true;
    50   }
    51  
    52   bool ConnectionManager::peerLoop(){
     56    network_threads.join_all();
     57    return true;
     58  }
     59 
     60  bool ConnectionManager::addPacket(ENetPacket *packet, ENetPeer *peer){
     61    if(client=NULL)
     62      return false;
     63    ClientList *temp=client;
     64    while(peer->host != temp->event->peer->host){
     65      temp=temp->next;
     66      if(temp==NULL)
     67        return false;
     68    }
     69    if(enet_peer_send(temp->event->peer, temp->ID, packet)!=0)
     70      return false;
     71    return true;
     72  }
     73 
     74  bool ConnectionManager::addPacket(ENetPacket *packet, int ID){
     75    if(client=NULL)
     76      return false;
     77    ClientList *temp=client;
     78    while(ID != temp->ID){
     79      temp=temp->next;
     80      if(temp==NULL)
     81        return false;
     82    }
     83    if(enet_peer_send(temp->event->peer, temp->ID, packet)!=0)
     84      return false;
     85    else
     86      return true;
     87  }
     88 
     89  bool ConnectionManager::addPacketAll(ENetPacket *packet){
     90    ClientList *temp=client;
     91    while(temp!=NULL){
     92      if(enet_peer_send(temp->event->peer, temp->ID, packet)!=0)
     93         return false;
     94    }
     95    return true;
     96  }
     97 
     98  bool ConnectionManager::sendPackets(ENetEvent *event){
     99    if(server==NULL)
     100      return false;
     101    if(enet_host_service(server, event, NETWORK_SEND_WAIT)>=0)
     102      return true;
     103    else
     104      return false;
     105  }
     106 
     107  void ConnectionManager::receiverThread(){
     108    // what about some error-handling here ?
     109    enet_initialize();
     110    atexit(enet_deinitialize);
    53111    ENetEvent event;
    54112    server = enet_host_create(&bindAddress, NETWORK_MAX_CONNECTIONS, 0, 0);
     
    65123      switch(event.type){
    66124        // log handling ================
    67       case std::EVENT_TYPE_CONNECT:
    68         addClient(event);
     125        case ENET_EVENT_TYPE_CONNECT:
     126        addClient(&event);
    69127        break;
    70       case std::EVENT_TYPE_RECEIVE:
    71         processData(event);
     128      case ENET_EVENT_TYPE_RECEIVE:
     129        std::cout << event.packet->data << std::endl;
     130        processData(&event);
    72131        break;
    73       case std::EVENT_TYPE_DISCONNECT:
     132      case ENET_EVENT_TYPE_DISCONNECT:
    74133        // add some error/log handling here
    75134        clientDisconnect(event.peer);
     
    81140  }
    82141 
    83   ConnectionManager::processData(ENetEvent event){
    84 //     insert packetdecode and buffer stuff here
    85    
    86   }
    87  
    88   bool ConnectionManager::clientDisconnect(ENetPeer peer){
    89     ClientList *temp=client;
    90     if(temp->event.peer==peer){
     142  bool ConnectionManager::processData(ENetEvent *event){
     143    // just add packet to the buffer
     144    // this can be extended with some preprocessing
     145    return buffer.push(event->packet);
     146  }
     147 
     148  bool ConnectionManager::clientDisconnect(ENetPeer *peer){
     149    ClientList *temp=client;
     150    // do we have to remove the first item ?
     151    if(temp->event->peer->host==peer->host){
    91152      if(temp->next==NULL){
    92153        client=NULL;
     
    98159    } else {
    99160      while(temp->next!=NULL){
    100         if(temp->next->event.peer==peer){
     161        if(temp->next->event->peer->host==peer->host){
     162          // do a correct relink and delete the disconnected client
    101163          ClientList *temp2=temp->next;
    102164          temp->next=temp2->next;
     
    104166          return true;
    105167        } else
     168          //otherwise keep on searching ;)
    106169          temp=temp->next;
    107170      }
     
    110173  }
    111174 
    112   bool ConnectionManager::addClient(ENetEvent event){
     175  bool ConnectionManager::addClient(ENetEvent *event){
     176   
     177    // first client?
    113178    if(client==NULL){
    114179      client =new ClientList;
     
    117182      client->event = event;
    118183    } else {
    119       ClienList *temp = client;
     184      // otherwise add a new element to clientlist
     185      ClientList *temp = client;
    120186      int i=1;
    121187      while(temp->next != NULL){
     
    132198  }
    133199 
    134   void ConnectionManager::test(){
    135     while(!quit)
    136    
    137    
    138   }
     200 
    139201}
Note: See TracChangeset for help on using the changeset viewer.