From f6a4674a2ffcefe37ab92043bd34d3259c1bcc58 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Mon, 2 Dec 2013 17:54:47 +1100 Subject: [PATCH] Moved networking code into high cohesion functions --- rsc/config.cfg | 4 +- server/server_application.cpp | 99 +++++++++++++++++++---------------- server/server_application.hpp | 6 +++ 3 files changed, 63 insertions(+), 46 deletions(-) diff --git a/rsc/config.cfg b/rsc/config.cfg index 5d86a1c..2f7b71b 100644 --- a/rsc/config.cfg +++ b/rsc/config.cfg @@ -1,7 +1,7 @@ #configuration of the programs -server.host = 127.0.0.1 +server.host = 255.255.255.255 server.port = 21795 -server.name = foobar +server.name = local server.dbname = database.db diff --git a/server/server_application.cpp b/server/server_application.cpp index d61ac82..9d71ee7 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -124,58 +124,19 @@ void ServerApplication::Quit() { void ServerApplication::HandlePacket(NetworkPacket packet) { switch(packet.meta.type) { case NetworkPacket::Type::BROADCAST_REQUEST: - //send back the server's name - packet.meta.type = NetworkPacket::Type::BROADCAST_RESPONSE; - snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str()); - network.Send(&packet.meta.srcAddress, &packet, sizeof(NetworkPacket)); + HandleBroadcastRequest(packet); break; - case NetworkPacket::Type::JOIN_REQUEST: { - //TODO: prevent duplicate logins from the same address? - - //create the new client, filling it with the correct info - Client newClient; - newClient.address = packet.meta.srcAddress; - - //push the new client - clientMap[Client::counter] = newClient; - - //send the client their info - packet.meta.type = NetworkPacket::Type::JOIN_RESPONSE; - packet.clientInfo.index = Client::counter; - network.Send(&newClient.address, &packet, sizeof(NetworkPacket)); - - //finished this routine - Client::counter++; - cout << "connect, total: " << clientMap.size() << endl; - } + case NetworkPacket::Type::JOIN_REQUEST: + HandleJoinRequest(packet); break; case NetworkPacket::Type::DISCONNECT: - //disconnect the specified client - network.Send(&clientMap[packet.clientInfo.index].address, &packet, sizeof(NetworkPacket)); - clientMap.erase(packet.clientInfo.index); - - //remove players? - - cout << "disconnect, total: " << clientMap.size() << endl; - break; - - case NetworkPacket::Type::SYNCHRONIZE: - //TODO + HandleDisconnect(packet); break; case NetworkPacket::Type::SHUTDOWN: - //end the server - running = false; - - //disconnect all clients - packet.meta.type = NetworkPacket::Type::DISCONNECT; - for (auto& it : clientMap) { - network.Send(&it.second.address, &packet, sizeof(NetworkPacket)); - } - - cout << "shutting down" << endl; + HandleShutdown(packet); break; //handle errors @@ -184,3 +145,53 @@ void ServerApplication::HandlePacket(NetworkPacket packet) { break; } } + +void ServerApplication::HandleBroadcastRequest(NetworkPacket packet) { + //send back the server's name + packet.meta.type = NetworkPacket::Type::BROADCAST_RESPONSE; + snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str()); + network.Send(&packet.meta.srcAddress, &packet, sizeof(NetworkPacket)); +} + +void ServerApplication::HandleJoinRequest(NetworkPacket packet) { + //TODO: prevent duplicate logins from the same address? + + //create the new client, filling it with the correct info + Client newClient; + newClient.address = packet.meta.srcAddress; + + //push the new client + clientMap[Client::counter] = newClient; + + //send the client their info + packet.meta.type = NetworkPacket::Type::JOIN_RESPONSE; + packet.clientInfo.index = Client::counter; + network.Send(&newClient.address, &packet, sizeof(NetworkPacket)); + + //finished this routine + Client::counter++; + cout << "connect, total: " << clientMap.size() << endl; +} + +void ServerApplication::HandleDisconnect(NetworkPacket packet) { + //disconnect the specified client + network.Send(&clientMap[packet.clientInfo.index].address, &packet, sizeof(NetworkPacket)); + clientMap.erase(packet.clientInfo.index); + + //TODO: remove players? + + cout << "disconnect, total: " << clientMap.size() << endl; +} + +void ServerApplication::HandleShutdown(NetworkPacket packet) { + //end the server + running = false; + + //disconnect all clients + packet.meta.type = NetworkPacket::Type::DISCONNECT; + for (auto& it : clientMap) { + network.Send(&it.second.address, &packet, sizeof(NetworkPacket)); + } + + cout << "shutting down" << endl; +} diff --git a/server/server_application.hpp b/server/server_application.hpp index 5dfa9a1..fb8958c 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -56,6 +56,12 @@ public: private: void HandlePacket(NetworkPacket); + //high cohesion utility functions + void HandleBroadcastRequest(NetworkPacket); + void HandleJoinRequest(NetworkPacket); + void HandleDisconnect(NetworkPacket); + void HandleShutdown(NetworkPacket); + //networking UDPNetworkUtility network;