Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/FICN/src/network/ClientConnection.cc @ 353

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

corrected some compiler-warnings

File size: 4.7 KB
Line 
1//
2// C++ Interface: ClientConnection
3//
4// Description: The Class ClientConnection manages the servers conenctions to the clients.
5// each connection is provided by a new process. communication between master process and
6// connection processes is provided by ...
7//
8//
9// Author:  Oliver Scheuss
10//
11
12#include "ClientConnection.h"
13
14// workaround for usleep(int) under windows
15#ifdef WIN32
16#include "winbase.h"
17#endif
18
19namespace network{
20
21  static boost::thread_group network_threads;
22
23  ClientConnection::ClientConnection(int port, std::string address){
24    quit=false;
25    server=NULL;
26    enet_address_set_host(&serverAddress, address.c_str());
27    serverAddress.port = NETWORK_PORT;
28    established=false;
29  }
30
31  ClientConnection::ClientConnection(int port, const char *address){
32    quit=false;
33    server=NULL;
34    enet_address_set_host(&serverAddress, address);
35    serverAddress.port = NETWORK_PORT;
36    established=false;
37  }
38
39  bool ClientConnection::waitEstablished(int milisec){
40    for(int i=0; i<=milisec && !established; i++)
41// under windows, use Sleep(milliseconds) instead of usleep(microseconds)
42#ifdef WIN32
43      Sleep(1);
44#else
45      usleep(1000);
46#endif
47    return established;
48  }
49
50
51  ENetPacket *ClientConnection::getPacket(ENetAddress &address){
52    if(!buffer.isEmpty())
53      return buffer.pop(address);
54    else
55        return NULL;
56  }
57
58  bool ClientConnection::queueEmpty(){
59    return buffer.isEmpty();
60  }
61
62  bool ClientConnection::createConnection(){
63    network_threads.create_thread(boost::bind(boost::mem_fn(&ClientConnection::receiverThread), this));
64    // wait 10 seconds for the connection to be established
65    return waitEstablished(10000);
66  }
67
68  bool ClientConnection::closeConnection(){
69    quit=true;
70    network_threads.join_all();
71    established=false;
72    return true;
73  }
74
75
76  bool ClientConnection::addPacket(ENetPacket *packet){
77    if(server==NULL)
78      return false;
79    if(enet_peer_send(server, 1, packet)!=0)
80      return false;
81    else
82      return true;
83  }
84
85  bool ClientConnection::sendPackets(ENetEvent *event){
86    if(server==NULL)
87      return false;
88    if(enet_host_service(client, event, NETWORK_SEND_WAIT)>=0)
89      return true;
90    else
91      return false;
92  }
93
94  bool ClientConnection::sendPackets(){
95    ENetEvent event;
96    if(server==NULL)
97      return false;
98    if(enet_host_service(client, &event, NETWORK_SEND_WAIT)>=0)
99      return true;
100    else
101      return false;
102  }
103
104  void ClientConnection::receiverThread(){
105    // what about some error-handling here ?
106    enet_initialize();
107    atexit(enet_deinitialize);
108    ENetEvent event;
109    client = enet_host_create(NULL, NETWORK_CLIENT_MAX_CONNECTIONS, 0, 0);
110    if(client==NULL)
111      // add some error handling here ==========================
112      quit=true;
113    //connect to the server
114    if(!establishConnection())
115      quit=true;
116    //main loop
117    while(!quit){
118      if(enet_host_service(client, &event, NETWORK_WAIT_TIMEOUT)<0){
119        // we should never reach this point
120        quit=true;
121        // add some error handling here ========================
122      }
123      switch(event.type){
124        // log handling ================
125      case ENET_EVENT_TYPE_CONNECT:
126      case ENET_EVENT_TYPE_RECEIVE:
127        processData(&event);
128        break;
129      case ENET_EVENT_TYPE_DISCONNECT:
130        // add some error/log handling here
131        // extend =====================
132        break;
133      case ENET_EVENT_TYPE_NONE:
134        continue;
135      }
136    }
137    // now disconnect
138
139    if(!disconnectConnection())
140    // if disconnecting failed destroy conn.
141      enet_peer_reset(server);
142    return;
143  }
144
145  bool ClientConnection::disconnectConnection(){
146    ENetEvent event;
147//     enet_peer_disconnect(server);
148    enet_peer_disconnect(server, 0);
149    while(enet_host_service(client, &event, NETWORK_WAIT_TIMEOUT) > 0){
150      switch (event.type)
151      {
152        case ENET_EVENT_TYPE_NONE:
153        case ENET_EVENT_TYPE_CONNECT:
154        case ENET_EVENT_TYPE_RECEIVE:
155          enet_packet_destroy(event.packet);
156          break;
157        case ENET_EVENT_TYPE_DISCONNECT:
158          return true;
159      }
160    }
161    enet_peer_reset(server);
162    return false;
163  }
164
165  bool ClientConnection::establishConnection(){
166    ENetEvent event;
167    // connect to peer
168    server = enet_host_connect(client, &serverAddress, NETWORK_CLIENT_CHANNELS);
169    if(server==NULL)
170      // error handling
171      return false;
172    // handshake
173    if(enet_host_service(client, &event, NETWORK_WAIT_TIMEOUT)>0 && event.type == ENET_EVENT_TYPE_CONNECT){
174      established=true;
175      return true;
176    }
177    else
178      return false;
179  }
180
181  bool ClientConnection::processData(ENetEvent *event){
182    // just add packet to the buffer
183    // this can be extended with some preprocessing
184    return buffer.push(event);
185  }
186
187
188}
Note: See TracBrowser for help on using the repository browser.