diff --git a/server/clients/client_manager.cpp b/server/clients/client_manager.cpp index 488a742..80d6942 100644 --- a/server/clients/client_manager.cpp +++ b/server/clients/client_manager.cpp @@ -21,11 +21,15 @@ */ #include "client_manager.hpp" +#include "ip_operators.hpp" #include "udp_network_utility.hpp" #include -int ClientManager::CheckConnections() { +std::list ClientManager::CheckConnections() { + //list of clients to disconnect + std::list returnList; + for (auto& it : elementMap) { //3 seconds between beats if (ClientData::Clock::now() - it.second.GetLastBeat() > std::chrono::seconds(3)) { @@ -38,21 +42,17 @@ int ClientManager::CheckConnections() { for (auto& it : elementMap) { if (it.second.GetAttempts() > 2) { - int ret = it.first; -// elementMap.erase(it.first); - return ret; + returnList.push_back(it.first); } } - return -1; + return returnList; } void ClientManager::HandlePong(ServerPacket* const argPacket) { //find and update the specified client for (auto& it : elementMap) { - if (it.second.GetAddress().host == argPacket->srcAddress.host && - it.second.GetAddress().port == argPacket->srcAddress.port - ) { + if (it.second.GetAddress() == argPacket->srcAddress) { it.second.ResetAttempts(); return; } diff --git a/server/clients/client_manager.hpp b/server/clients/client_manager.hpp index 320499f..9dcec7c 100644 --- a/server/clients/client_manager.hpp +++ b/server/clients/client_manager.hpp @@ -29,12 +29,13 @@ #include "SDL/SDL_net.h" #include +#include #include class ClientManager: public Singleton { public: //methods - int CheckConnections(); + std::list CheckConnections(); void HandlePong(ServerPacket* const argPacket); //common public methods diff --git a/server/server_logic.cpp b/server/server_logic.cpp index 78d5114..3ea6a30 100644 --- a/server/server_logic.cpp +++ b/server/server_logic.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include @@ -161,9 +162,16 @@ void ServerApplication::Init(int argc, char* argv[]) { } void ServerApplication::Proc() { + //network buffer SerialPacket* packetBuffer = reinterpret_cast(new char[MAX_PACKET_SIZE]); memset(packetBuffer, 0, MAX_PACKET_SIZE); //zero the buffer + //time system + typedef std::chrono::steady_clock Clock; + + Clock::time_point simTime = Clock::now(); + Clock::time_point realTime; + while(running) { //suck in the waiting packets & process them while(network.Receive(packetBuffer)) { @@ -173,18 +181,20 @@ void ServerApplication::Proc() { catch(std::exception& e) { std::cerr << "HandlePacket Error: " << e.what() << std::endl; } - memset(packetBuffer, 0, MAX_PACKET_SIZE); //reset the buffer + //reset the buffer + memset(packetBuffer, 0, MAX_PACKET_SIZE); } - //update the internals - //... - //Check connections - int disconnected = clientMgr.CheckConnections(); - if (disconnected != -1) { - FullClientUnload(disconnected); - std::cerr << "Client dropped: " << disconnected << std::endl; + //Check client connections + std::list disconnections = clientMgr.CheckConnections(); + for(auto const& it : disconnections) { + FullClientUnload(it); + std::cerr << "Client dropped: " << it << std::endl; } + //"tick" the internals + //... + //give the machine a break SDL_Delay(10); }