diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 66bb30ed..f1d60c16 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -18,6 +18,7 @@ public: Client(); ~Client(); void Start(); + void Close(); private: // Threaded @@ -27,6 +28,7 @@ private: int Receive(char* data, size_t length); int CreateMessage(MessageType type, std::string message, char* data); + void Disconnect(); void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void ParseMessageType(char* data, size_t length); void ParseEventMessage(char* data, size_t length); @@ -51,6 +53,7 @@ private: double m_DurationOfPingTime; bool m_ShouldDrawGameBoard = true; std::string m_PlayerName; + bool m_ThreadIsRunning = true; }; #endif diff --git a/include/Game/Game.h b/include/Game/Game.h index 85c0d6c4..cf0c5e6b 100644 --- a/include/Game/Game.h +++ b/include/Game/Game.h @@ -8,6 +8,9 @@ #include "Core/InputManager.h" #include "GUI/Frame.h" #include "Core/World.h" +// Network +#include +#include "Network/Client.h" class Game { @@ -26,6 +29,13 @@ private: InputManager* m_InputManager; GUI::Frame* m_FrameStack; World* m_World; + // Network viriables + boost::thread m_NetworkThread; + Client m_Client; + + // Network methods + void NetworkFunction(); + }; #endif diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index bdb8eebb..53ec3d9f 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -49,6 +49,12 @@ void Client::Start() threads.join_all(); } +void Client::Close() +{ + Disconnect(); + m_ThreadIsRunning = false; +} + void Client::InputLoop() { int intervallMs = 33; // ~30 times per second @@ -56,7 +62,7 @@ void Client::InputLoop() std::clock_t previousInputTime = std::clock(); std::clock_t previousCommandTime = std::clock(); - while (true) { + while (m_ThreadIsRunning) { std::clock_t currentTime = std::clock(); int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC); @@ -77,7 +83,7 @@ void Client::InputLoop() void Client::DisplayLoop() { - while (true) { + while (m_ThreadIsRunning) { // Update gameboard for (size_t i = 0; i < BOARDSIZE; i++) { for (size_t j = 0; j < BOARDSIZE; j++) { @@ -95,7 +101,7 @@ void Client::ReadFromServer() int bytesRead = -1; char readBuf[1024] = { 0 }; - for (;;) { + while (m_ThreadIsRunning) { if (m_Socket.available()) { bytesRead = Receive(readBuf, INPUTSIZE); ParseMessageType(readBuf, bytesRead); @@ -244,6 +250,16 @@ int Client::CreateMessage(MessageType type, std::string message, char* data) return offset; } +void Client::Disconnect() +{ + char* dataPackage = new char[INPUTSIZE]; // The package that will be sent to the server, when filled + int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); + m_Socket.send_to(boost::asio::buffer( + dataPackage, + len), + m_ReceiverEndpoint, 0); +} + void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize) { data += stepSize; @@ -310,11 +326,7 @@ void Client::SendInput() m_ReceiverEndpoint, 0); } if (GetAsyncKeyState('V')) { - int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); - m_Socket.send_to(boost::asio::buffer( - dataPackage, - len), - m_ReceiverEndpoint, 0); + Disconnect(); } memset(dataPackage, 0, INPUTSIZE); diff --git a/src/Game/Game.cpp b/src/Game/Game.cpp index 611aa328..661cd31a 100644 --- a/src/Game/Game.cpp +++ b/src/Game/Game.cpp @@ -1,6 +1,5 @@ #include "Game.h" #include "HardcodedTestWorld.h" -#include "Network/Client.h" Game::Game(int argc, char* argv[]) { @@ -38,13 +37,7 @@ Game::Game(int argc, char* argv[]) m_World = new HardcodedTestWorld(); // TEMP: Invoke network - std::string inputMessage; - std::cout << "Start client or server? (c/s)" << std::endl; - std::cin >> inputMessage; - if (inputMessage == "c" || inputMessage == "C") { - Client client; - client.Start(); - } + boost::thread workerThread(&Game::NetworkFunction, this); m_LastTime = glfwGetTime(); } @@ -53,6 +46,7 @@ Game::~Game() { delete m_FrameStack; delete m_EventBroker; + m_Client.Close(); } void Game::Tick() @@ -75,3 +69,13 @@ void Game::Tick() glfwPollEvents(); } + +void Game::NetworkFunction() +{ + std::string inputMessage; + std::cout << "Start client or server? (c/s)" << std::endl; + std::cin >> inputMessage; + if (inputMessage == "c" || inputMessage == "C") { + m_Client.Start(); + } +} \ No newline at end of file