Network now runs on it's own thread.

Network now sends Disconnect message when game is terminated.
This commit is contained in:
Jocke
2015-12-08 11:02:40 +01:00
parent 2c993e82d6
commit b5a010a517
4 changed files with 45 additions and 16 deletions
+3
View File
@@ -18,6 +18,7 @@ public:
Client(); Client();
~Client(); ~Client();
void Start(); void Start();
void Close();
private: private:
// Threaded // Threaded
@@ -27,6 +28,7 @@ private:
int Receive(char* data, size_t length); int Receive(char* data, size_t length);
int CreateMessage(MessageType type, std::string message, char* data); int CreateMessage(MessageType type, std::string message, char* data);
void Disconnect();
void MoveMessageHead(char*& data, size_t& length, size_t stepSize); void MoveMessageHead(char*& data, size_t& length, size_t stepSize);
void ParseMessageType(char* data, size_t length); void ParseMessageType(char* data, size_t length);
void ParseEventMessage(char* data, size_t length); void ParseEventMessage(char* data, size_t length);
@@ -51,6 +53,7 @@ private:
double m_DurationOfPingTime; double m_DurationOfPingTime;
bool m_ShouldDrawGameBoard = true; bool m_ShouldDrawGameBoard = true;
std::string m_PlayerName; std::string m_PlayerName;
bool m_ThreadIsRunning = true;
}; };
#endif #endif
+10
View File
@@ -8,6 +8,9 @@
#include "Core/InputManager.h" #include "Core/InputManager.h"
#include "GUI/Frame.h" #include "GUI/Frame.h"
#include "Core/World.h" #include "Core/World.h"
// Network
#include <boost/thread.hpp>
#include "Network/Client.h"
class Game class Game
{ {
@@ -26,6 +29,13 @@ private:
InputManager* m_InputManager; InputManager* m_InputManager;
GUI::Frame* m_FrameStack; GUI::Frame* m_FrameStack;
World* m_World; World* m_World;
// Network viriables
boost::thread m_NetworkThread;
Client m_Client;
// Network methods
void NetworkFunction();
}; };
#endif #endif
+20 -8
View File
@@ -49,6 +49,12 @@ void Client::Start()
threads.join_all(); threads.join_all();
} }
void Client::Close()
{
Disconnect();
m_ThreadIsRunning = false;
}
void Client::InputLoop() void Client::InputLoop()
{ {
int intervallMs = 33; // ~30 times per second int intervallMs = 33; // ~30 times per second
@@ -56,7 +62,7 @@ void Client::InputLoop()
std::clock_t previousInputTime = std::clock(); std::clock_t previousInputTime = std::clock();
std::clock_t previousCommandTime = std::clock(); std::clock_t previousCommandTime = std::clock();
while (true) { while (m_ThreadIsRunning) {
std::clock_t currentTime = std::clock(); std::clock_t currentTime = std::clock();
int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC); int testTimeShit = (1000 * (currentTime - previousCommandTime) / (double)CLOCKS_PER_SEC);
@@ -77,7 +83,7 @@ void Client::InputLoop()
void Client::DisplayLoop() void Client::DisplayLoop()
{ {
while (true) { while (m_ThreadIsRunning) {
// Update gameboard // Update gameboard
for (size_t i = 0; i < BOARDSIZE; i++) { for (size_t i = 0; i < BOARDSIZE; i++) {
for (size_t j = 0; j < BOARDSIZE; j++) { for (size_t j = 0; j < BOARDSIZE; j++) {
@@ -95,7 +101,7 @@ void Client::ReadFromServer()
int bytesRead = -1; int bytesRead = -1;
char readBuf[1024] = { 0 }; char readBuf[1024] = { 0 };
for (;;) { while (m_ThreadIsRunning) {
if (m_Socket.available()) { if (m_Socket.available()) {
bytesRead = Receive(readBuf, INPUTSIZE); bytesRead = Receive(readBuf, INPUTSIZE);
ParseMessageType(readBuf, bytesRead); ParseMessageType(readBuf, bytesRead);
@@ -244,6 +250,16 @@ int Client::CreateMessage(MessageType type, std::string message, char* data)
return offset; 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) void Client::MoveMessageHead(char*& data, size_t& length, size_t stepSize)
{ {
data += stepSize; data += stepSize;
@@ -310,11 +326,7 @@ void Client::SendInput()
m_ReceiverEndpoint, 0); m_ReceiverEndpoint, 0);
} }
if (GetAsyncKeyState('V')) { if (GetAsyncKeyState('V')) {
int len = CreateMessage(MessageType::Disconnect, "+Disconnect", dataPackage); Disconnect();
m_Socket.send_to(boost::asio::buffer(
dataPackage,
len),
m_ReceiverEndpoint, 0);
} }
memset(dataPackage, 0, INPUTSIZE); memset(dataPackage, 0, INPUTSIZE);
+12 -8
View File
@@ -1,6 +1,5 @@
#include "Game.h" #include "Game.h"
#include "HardcodedTestWorld.h" #include "HardcodedTestWorld.h"
#include "Network/Client.h"
Game::Game(int argc, char* argv[]) Game::Game(int argc, char* argv[])
{ {
@@ -38,13 +37,7 @@ Game::Game(int argc, char* argv[])
m_World = new HardcodedTestWorld(); m_World = new HardcodedTestWorld();
// TEMP: Invoke network // TEMP: Invoke network
std::string inputMessage; boost::thread workerThread(&Game::NetworkFunction, this);
std::cout << "Start client or server? (c/s)" << std::endl;
std::cin >> inputMessage;
if (inputMessage == "c" || inputMessage == "C") {
Client client;
client.Start();
}
m_LastTime = glfwGetTime(); m_LastTime = glfwGetTime();
} }
@@ -53,6 +46,7 @@ Game::~Game()
{ {
delete m_FrameStack; delete m_FrameStack;
delete m_EventBroker; delete m_EventBroker;
m_Client.Close();
} }
void Game::Tick() void Game::Tick()
@@ -75,3 +69,13 @@ void Game::Tick()
glfwPollEvents(); 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();
}
}