diff --git a/server/network_queue.cpp b/server/network_queue.cpp index 18d254c..1ee328e 100644 --- a/server/network_queue.cpp +++ b/server/network_queue.cpp @@ -108,3 +108,12 @@ void NetworkQueue::ResetMembers() { thread = nullptr; queue.clear(); } + +int NetworkQueue::Size() { + //can't be sure if std::deque::size() is thread safe + int ret; + SDL_SemWait(lock); + ret = queue.size(); + SDL_SemPost(lock); + return ret; +} \ No newline at end of file diff --git a/server/network_queue.hpp b/server/network_queue.hpp index 6fe2fa1..f10e502 100644 --- a/server/network_queue.hpp +++ b/server/network_queue.hpp @@ -20,6 +20,8 @@ public: NetworkPacket Peek(); NetworkPacket Pop(); void Flush(); + + int Size(); private: friend int networkQueueThread(void*); void ResetMembers(); diff --git a/server/server_application.cpp b/server/server_application.cpp index d2d4098..400d546 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -109,10 +109,13 @@ void ServerApplication::Loop() { //debugging SDL_Delay(1000); - NetworkPacket packet; - while(networkQueue.Peek().meta.type != NetworkPacket::Type::NONE) { - packet = networkQueue.Pop(); - std::cout << packet.serverInfo.name << std::endl; + while(networkQueue.Size() > 0) { + try { + HandlePacket(networkQueue.Pop()); + } + catch(std::exception& e) { + std::cerr << "Network Error: " << e.what() << std::endl; + } }; } @@ -123,3 +126,40 @@ void ServerApplication::Quit() { SDLNet_Quit(); SDL_Quit(); } + +void ServerApplication::HandlePacket(NetworkPacket packet) { + switch(packet.meta.type) { + case NetworkPacket::Type::PING: + //NOT USED + break; + case NetworkPacket::Type::PONG: + //NOT USED + break; + case NetworkPacket::Type::BROADCAST_REQUEST: + // + break; +// case NetworkPacket::Type::BROADCAST_RESPONSE: +// // +// break; + case NetworkPacket::Type::JOIN_REQUEST: + // + break; +// case NetworkPacket::Type::JOIN_RESPONSE: +// // +// break; + case NetworkPacket::Type::DISCONNECT: + // + break; + case NetworkPacket::Type::SYNCHRONIZE: + // + break; + + //handle errors + case NetworkPacket::Type::NONE: + throw(std::runtime_error("NetworkPacket::Type::NONE encountered")); + break; + default: + throw(std::runtime_error("Unknown NetworkPacket::Type encountered")); + break; + } +} \ No newline at end of file diff --git a/server/server_application.hpp b/server/server_application.hpp index 5328cf4..689bb53 100644 --- a/server/server_application.hpp +++ b/server/server_application.hpp @@ -48,6 +48,7 @@ public: void Quit(); private: + void HandlePacket(NetworkPacket); bool running = true; sqlite3* database = nullptr;