From 3376f4a16ee10fbe5ea6d11b44d12a086ea061bf Mon Sep 17 00:00:00 2001 From: stiffly Date: Wed, 20 Jan 2016 16:27:53 +0100 Subject: [PATCH] Added server has timed out logic to client. (>'')> --- include/Engine/Network/Client.h | 5 ++-- include/Engine/Network/Network.h | 1 + include/Engine/Network/Server.h | 2 +- src/Engine/Network/Client.cpp | 40 +++++++++++++++++++++----------- src/Engine/Network/Server.cpp | 3 +-- 5 files changed, 32 insertions(+), 19 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 73f0eb50..511ce5f7 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -48,6 +48,7 @@ private: std::string m_PlayerName; int m_PlayerID = -1; EntityID m_ServerEntityID = std::numeric_limits::max(); + bool m_IsConnected = false; // Server Client Lookup map // Assumes that root node for client and server is EntityID 0. @@ -71,14 +72,14 @@ private: void ping(); void parseMessageType(Packet& packet); void updateFields(Packet& packet, const ComponentInfo& componentInfo, const EntityID& entityID, const std::string& componentType); - void parseConnect(Packet& packet); + void parseConnect(Packet& packet); void parsePlayerConnected(Packet& packet); void parsePing(); void parseServerPing(); void InterpolateFields(Packet & packet, const ComponentInfo & componentInfo, const EntityID & entityID, const std::string & componentType); void parseSnapshot(Packet& packet); void identifyPacketLoss(); - bool isConnected(); + bool hasServerTimedOut(); EntityID createPlayer(); void sendInputCommands(); // Mapping Logic diff --git a/include/Engine/Network/Network.h b/include/Engine/Network/Network.h index cb86b941..1464a96f 100644 --- a/include/Engine/Network/Network.h +++ b/include/Engine/Network/Network.h @@ -7,6 +7,7 @@ #define MAXCONNECTIONS 8 #define INPUTSIZE 4097 +#define TIMEOUTMS 15000 class Network { diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 3b871e43..2f21816a 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -11,7 +11,7 @@ #include "Network/PlayerDefinition.h" #include "Core/World.h" #include "Core/EventBroker.h" -#include "Network/Network.h" +#include "../Network/Network.h" #include "Input/EInputCommand.h" #include "Core/EPlayerDamage.h" diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index 83e0d886..a5c34963 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -35,6 +35,9 @@ void Client::Update() { m_EventBroker->Process(); readFromServer(); + if (m_IsConnected) { + hasServerTimedOut(); + } } void Client::readFromServer() @@ -86,10 +89,8 @@ void Client::parseMessageType(Packet& packet) void Client::parseConnect(Packet& packet) { // Set your own player id - m_PlayerID = packet.ReadPrimitive(); - m_ServerEntityID = packet.ReadPrimitive(); // Map ServerEntityID and your PlayerID - LOG_INFO("%i: I am player: %i", m_PacketID, m_PlayerID); + LOG_INFO("I are connected PogChamp"); } void Client::parsePlayerConnected(Packet & packet) @@ -100,12 +101,18 @@ void Client::parsePlayerConnected(Packet & packet) void Client::parsePing() { - m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); - LOG_INFO("%i: response time with ctime(ms): %f", m_PacketID, m_DurationOfPingTime); + } void Client::parseServerPing() { + // Might miss connect message so set it here instead. + m_IsConnected = true; + // Time since last ping was received + m_DurationOfPingTime = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); + LOG_INFO("%i: response time with ctime(ms): %f", m_PacketID, m_DurationOfPingTime); + m_StartPingTime = std::clock(); + Packet packet(MessageType::ServerPing, m_SendPacketID); packet.WriteString("Ping recieved"); send(packet); @@ -238,16 +245,18 @@ void Client::connect() void Client::disconnect() { + m_PreviousPacketID = 0; + m_PacketID = 0; Packet packet(MessageType::Disconnect, m_SendPacketID); send(packet); } void Client::ping() { - Packet packet(MessageType::Connect, m_SendPacketID); - packet.WriteString("Ping"); - m_StartPingTime = std::clock(); - send(packet); + //Packet packet(MessageType::Connect, m_SendPacketID); + //packet.WriteString("Ping"); + //m_StartPingTime = std::clock(); + //send(packet); } bool Client::OnInputCommand(const Events::InputCommand & e) @@ -290,12 +299,15 @@ void Client::identifyPacketLoss() } } -bool Client::isConnected() +bool Client::hasServerTimedOut() { - if (m_PlayerID != -1) { - if (m_PlayerDefinitions[m_PlayerID].EntityID != -1) { - return true; - } + // Time in ms + float timeSincePing = 1000 * (std::clock() - m_StartPingTime) / static_cast(CLOCKS_PER_SEC); + if (timeSincePing > TIMEOUTMS) { + // Clear everything and go to menu. + LOG_INFO("Server has timed out, returning to menu, Beep Boop."); + m_IsConnected = false; + return true; } return false; } diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index c598f1f1..ec593cb7 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -182,7 +182,6 @@ void Server::sendPing() void Server::checkForTimeOuts() { - int timeOutTimeMs = 5000; int startPing = 1000 * m_StartPingTime / static_cast(CLOCKS_PER_SEC); @@ -190,7 +189,7 @@ void Server::checkForTimeOuts() if (m_PlayerDefinitions[i].Endpoint.address() != boost::asio::ip::address()) { int stopPing = 1000 * m_PlayerDefinitions[i].StopTime / static_cast(CLOCKS_PER_SEC); - if (startPing > stopPing + timeOutTimeMs) { + if (startPing > stopPing + TIMEOUTMS) { LOG_INFO("Player %i timed out!", i); disconnect(i); }