00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <algorithm>
00022
00023 #include "net/connectionhandler.hpp"
00024
00025 #include "defines.h"
00026 #include "common/configuration.hpp"
00027 #include "net/bandwidth.hpp"
00028 #include "net/messagein.hpp"
00029 #include "net/messageout.hpp"
00030 #include "net/netcomputer.hpp"
00031 #include "utils/logger.h"
00032
00033 bool ConnectionHandler::startListen(enet_uint16 port)
00034 {
00035
00036 address.host = ENET_HOST_ANY;
00037 address.port = port;
00038
00039 LOG_INFO("Listening on port " << port << "...");
00040 host = enet_host_create(
00041 &address ,
00042 Configuration::getValue("net_maxClients", 1000) ,
00043 0 ,
00044 0 );
00045
00046 return host;
00047 }
00048
00049 void ConnectionHandler::stopListen()
00050 {
00051
00052
00053
00054 ENetPeer *currentPeer;
00055
00056 for (currentPeer = host->peers;
00057 currentPeer < &host->peers[host->peerCount];
00058 ++currentPeer)
00059 {
00060 if (currentPeer->state == ENET_PEER_STATE_CONNECTED)
00061 {
00062 enet_peer_disconnect(currentPeer, 0);
00063 enet_host_flush(host);
00064 enet_peer_reset(currentPeer);
00065 }
00066 }
00067 enet_host_destroy(host);
00068
00069 }
00070
00071 void ConnectionHandler::flush()
00072 {
00073 enet_host_flush(host);
00074 }
00075
00076 void ConnectionHandler::process(enet_uint32 timeout)
00077 {
00078 ENetEvent event;
00079
00080 while (enet_host_service(host, &event, timeout) > 0) {
00081 switch (event.type) {
00082 case ENET_EVENT_TYPE_CONNECT:
00083 {
00084 NetComputer *comp = computerConnected(event.peer);
00085 clients.push_back(comp);
00086 LOG_INFO("A new client connected from " << *comp << ":"
00087 << event.peer->address.port << " to port "
00088 << host->address.port);
00089
00090
00091 event.peer->data = (void *)comp;
00092 } break;
00093
00094 case ENET_EVENT_TYPE_RECEIVE:
00095 {
00096 NetComputer *comp =
00097 static_cast<NetComputer*>(event.peer->data);
00098
00099
00100
00101
00102
00103 if (event.packet->dataLength >= 2) {
00104 MessageIn msg((char *)event.packet->data,
00105 event.packet->dataLength);
00106 LOG_DEBUG("Received message " << msg << " from "
00107 << *comp);
00108
00109 gBandwidth->increaseClientInput(comp, event.packet->dataLength);
00110
00111 processMessage(comp, msg);
00112 } else {
00113 LOG_ERROR("Message too short from " << *comp);
00114 }
00115
00116
00117 enet_packet_destroy(event.packet);
00118 } break;
00119
00120 case ENET_EVENT_TYPE_DISCONNECT:
00121 {
00122 NetComputer *comp =
00123 static_cast<NetComputer*>(event.peer->data);
00124
00125 LOG_INFO("" << *comp << " disconnected.");
00126
00127
00128 computerDisconnected(comp);
00129 clients.erase(std::find(clients.begin(), clients.end(), comp));
00130 event.peer->data = NULL;
00131 } break;
00132
00133 default: break;
00134 }
00135 }
00136 }
00137
00138 void ConnectionHandler::sendToEveryone(const MessageOut &msg)
00139 {
00140 for (NetComputers::iterator i = clients.begin(), i_end = clients.end();
00141 i != i_end; ++i)
00142 {
00143 (*i)->send(msg);
00144 }
00145 }
00146
00147 unsigned int ConnectionHandler::getClientNumber()
00148 {
00149 return clients.size();
00150 }