From 6da5fd1263a8c831fe3a87811412ee73d05f13b0 Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 16 Dec 2015 15:47:51 +0100 Subject: [PATCH 1/2] Restructured code and added bool to stop client from spamming Snapshots to a server when it wasn't connected to one. --- include/Engine/Network/Client.h | 52 ++++++++++++++++----------------- include/Engine/Network/Server.h | 2 +- src/Engine/Network/Client.cpp | 7 ++++- 3 files changed, 33 insertions(+), 28 deletions(-) diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 21f6ec61..00d05a94 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -27,57 +27,57 @@ public: void Start(World* world, EventBroker* eventBroker); void Update(); void Close(); -private: - void ReadFromServer(); - void SendSnapshotToServer(); - int Receive(char* data, size_t length); - void Send(Package& message); - int CreateMessage(MessageType type, std::string message, char* data); - void Connect(); - void Disconnect(); - void Ping(); - void MoveMessageHead(char*& data, size_t& length, size_t stepSize); - void ParseMessageType(Package& package); - void ParseEventMessage(Package& package); - void ParseConnect(Package& package); - void ParsePing(); - void ParseServerPing(); - void ParseSnapshot(Package& package); - void CreateNewPlayer(int i); - void IdentifyPacketLoss(); +private: // udp stuff boost::asio::ip::udp::endpoint m_ReceiverEndpoint; boost::asio::io_service m_IOService; boost::asio::ip::udp::socket m_Socket; - + //Connection logic + bool m_IsConnected = false; // Packet loss logic unsigned int m_PacketID = 0; unsigned int m_PreviousPacketID = 0; unsigned int m_SendPacketID = 0; - // Game Logic + glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; + PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; std::vector m_PlayersToCreate; - - World* m_World; - int m_PlayerID = -1; - glm::vec2 m_PlayerPositions[MAXCONNECTIONS]; - PlayerDefinition m_PlayerDefinitions[MAXCONNECTIONS]; SnapshotDefinitions m_NextSnapshot; std::clock_t m_StartPingTime; double m_DurationOfPingTime; std::string m_PlayerName; bool m_ThreadIsRunning = true; + int m_PlayerID = -1; + World* m_World; // Use to check if we should send disconnect message // if game is turned of by closing window. bool m_WasStarted = false; IsWASDKeyDown m_IsWASDKeyDown; - // Events EventBroker* m_EventBroker; EventRelay m_EInputCommand; bool OnInputCommand(const Events::InputCommand &e); + + // Network functions + void ReadFromServer(); + void SendSnapshotToServer(); + int Receive(char* data, size_t length); + void Send(Package& message); + int CreateMessage(MessageType type, std::string message, char* data); + void Connect(); + void Disconnect(); + void Ping(); + void MoveMessageHead(char*& data, size_t& length, size_t stepSize); + void ParseMessageType(Package& package); + void ParseEventMessage(Package& package); + void ParseConnect(Package& package); + void ParsePing(); + void ParseServerPing(); + void ParseSnapshot(Package& package); + void CreateNewPlayer(int i); + void IdentifyPacketLoss(); }; #endif diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index fb49e707..65a69bba 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -50,7 +50,7 @@ private: void ReadFromClients(); void InputLoop(); - + // Network functions int Receive(char* data, size_t length); void Send(Package& package, int playerID); void Send(Package& package); diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index a4199b8e..b980bfde 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -56,6 +56,7 @@ void Client::Close() if (m_WasStarted) { Disconnect(); m_ThreadIsRunning = false; + m_IsConnected = false; m_EventBroker->Unsubscribe(m_EInputCommand); } } @@ -78,7 +79,9 @@ void Client::ReadFromServer() } std::clock_t currentTime = std::clock(); if (snapshotInterval < (1000 * (currentTime - previousSnapshotMessage) / (double)CLOCKS_PER_SEC)) { - SendSnapshotToServer(); + if (m_IsConnected) { + SendSnapshotToServer(); + } previousSnapshotMessage = currentTime; } } @@ -168,6 +171,7 @@ void Client::ParseConnect(Package& package) m_PacketID = package.PopFrontPrimitive(); m_PreviousPacketID = m_PacketID; m_PlayerID = package.PopFrontPrimitive(); + m_IsConnected = true; std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; } @@ -267,6 +271,7 @@ void Client::Connect() void Client::Disconnect() { + m_IsConnected = false; Package message(MessageType::Connect, m_SendPacketID); message.AddString("+Disconnect"); Send(message); From 425f3ca3dd7bbb89ac4f65c88876f55e0f37701a Mon Sep 17 00:00:00 2001 From: Jocke Date: Wed, 16 Dec 2015 16:49:18 +0100 Subject: [PATCH 2/2] Fixed "trying to read more than package size" warnings. --- src/Engine/Network/Client.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index b980bfde..52037577 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -38,7 +38,7 @@ void Client::Start(World* world, EventBroker* eventBroker) } void Client::Update() -{ +{ while (m_PlayersToCreate.size() > 0) { unsigned int i = m_PlayersToCreate.size() - 1; unsigned int tempID = m_World->CreateEntity(); @@ -117,7 +117,7 @@ void Client::SendSnapshotToServer() package.AddString("0Forward"); Send(package); } - + if (m_NextSnapshot.InputRight != "") { @@ -168,8 +168,6 @@ void Client::ParseMessageType(Package& package) void Client::ParseConnect(Package& package) { - m_PacketID = package.PopFrontPrimitive(); - m_PreviousPacketID = m_PacketID; m_PlayerID = package.PopFrontPrimitive(); m_IsConnected = true; std::cout << m_PacketID << ": I am player: " << m_PlayerID << std::endl; @@ -210,7 +208,7 @@ void Client::ParseSnapshot(Package& package) // We're checking for empty name for now. This might not be the best way, // but it is to avoid sending redundant data. tempName = package.PopFrontString(); - + // Apply the position data read to the player entity // New player connected on the server side @@ -225,13 +223,13 @@ void Client::ParseSnapshot(Package& package) // Not a connected player break; } - // Read position data - glm::vec3 playerPos; - playerPos.x = package.PopFrontPrimitive(); - playerPos.y = package.PopFrontPrimitive(); - playerPos.z = package.PopFrontPrimitive(); - // Move player to server position if (m_PlayerDefinitions[i].EntityID != -1) { + // Read position data + glm::vec3 playerPos; + playerPos.x = package.PopFrontPrimitive(); + playerPos.y = package.PopFrontPrimitive(); + playerPos.z = package.PopFrontPrimitive(); + // Move player to server position m_World->GetComponent(m_PlayerDefinitions[i].EntityID, "Transform")["Position"] = playerPos; } } @@ -296,8 +294,7 @@ bool Client::OnInputCommand(const Events::InputCommand & e) if (e.Command == "Forward") { if (e.Value > 0) { m_IsWASDKeyDown.W = true; - } - else if (e.Value < 0) { + } else if (e.Value < 0) { m_IsWASDKeyDown.S = true; } else { m_IsWASDKeyDown.W = false; @@ -333,6 +330,6 @@ void Client::IdentifyPacketLoss() // if no packets lost, difference should be equal to 1 int difference = m_PacketID - m_PreviousPacketID; if (difference != 1) { - LOG_INFO("%i Packet(s) were lost...", difference); + LOG_INFO("%i Packet(s) were lost...", difference); } }