From 9db86c19f678afde3406f84aa252f621b719d41d Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Sat, 15 Mar 2014 23:36:31 +1100 Subject: [PATCH] Implemented a macro for the serial buffer size --- client/client_application.cpp | 2 +- client/scenes/in_world.cpp | 18 +++++++++--------- client/scenes/lobby_menu.cpp | 8 ++++---- common/network/network_packet.hpp | 4 ++++ common/network/serial.cpp | 26 ++++++++++++++++++++++++++ server/server_application.cpp | 23 ++++++++++++----------- 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/client/client_application.cpp b/client/client_application.cpp index faac031..2bf9203 100644 --- a/client/client_application.cpp +++ b/client/client_application.cpp @@ -68,7 +68,7 @@ void ClientApplication::Init() { if (SDLNet_Init()) { throw(std::runtime_error("Failed to initialize SDL_net")); } - network.Open(0, sizeof(NetworkPacket)); + network.Open(0, PACKET_BUFFER_SIZE); } void ClientApplication::Proc() { diff --git a/client/scenes/in_world.cpp b/client/scenes/in_world.cpp index b156064..2ad41a5 100644 --- a/client/scenes/in_world.cpp +++ b/client/scenes/in_world.cpp @@ -65,14 +65,14 @@ InWorld::InWorld(ConfigUtility* const argConfig, UDPNetworkUtility* const argNet packet.playerInfo.motion = {0,0}; //send it - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; serialize(&packet, buffer); - network.Send(Channels::SERVER, buffer, sizeof(NetworkPacket)); + network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); //request a sync packet.meta.type = NetworkPacket::Type::SYNCHRONIZE; serialize(&packet, buffer); - network.Send(Channels::SERVER, buffer, sizeof(NetworkPacket)); + network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); } InWorld::~InWorld() { @@ -290,7 +290,7 @@ void InWorld::HandlePlayerUpdate(NetworkPacket packet) { void InWorld::SendState() { NetworkPacket packet; - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; //pack the packet packet.meta.type = NetworkPacket::Type::PLAYER_UPDATE; @@ -302,27 +302,27 @@ void InWorld::SendState() { packet.playerInfo.motion = localCharacter->GetMotion(); serialize(&packet, buffer); - network.Send(Channels::SERVER, buffer, sizeof(NetworkPacket)); + network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); } void InWorld::RequestDisconnect() { NetworkPacket packet; - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; //send a disconnect request packet.meta.type = NetworkPacket::Type::DISCONNECT; packet.clientInfo.index = clientIndex; serialize(&packet, buffer); - network.Send(Channels::SERVER, buffer, sizeof(NetworkPacket)); + network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); } void InWorld::RequestShutDown() { NetworkPacket packet; - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; //send a shutdown request packet.meta.type = NetworkPacket::Type::SHUTDOWN; packet.clientInfo.index = clientIndex; serialize(&packet, buffer); - network.Send(Channels::SERVER, buffer, sizeof(NetworkPacket)); + network.Send(Channels::SERVER, buffer, PACKET_BUFFER_SIZE); } \ No newline at end of file diff --git a/client/scenes/lobby_menu.cpp b/client/scenes/lobby_menu.cpp index 4b1c5fb..b7827c6 100644 --- a/client/scenes/lobby_menu.cpp +++ b/client/scenes/lobby_menu.cpp @@ -127,12 +127,12 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { if (search.MouseButtonUp(button) == Button::State::HOVER) { //the vars NetworkPacket packet; - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; //broadcast to the network, or a specific server packet.meta.type = NetworkPacket::Type::BROADCAST_REQUEST; serialize(&packet, buffer); - network.Send(config["server.host"].c_str(), config.Int("server.port"), buffer, sizeof(NetworkPacket)); + network.Send(config["server.host"].c_str(), config.Int("server.port"), buffer, PACKET_BUFFER_SIZE); //reset the server list serverInfo.clear(); @@ -142,12 +142,12 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr) { //the vars NetworkPacket packet; - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; //join the selected server packet.meta.type = NetworkPacket::Type::JOIN_REQUEST; serialize(&packet, buffer); - network.Send(&selection->address, buffer, sizeof(NetworkPacket)); + network.Send(&selection->address, buffer, PACKET_BUFFER_SIZE); selection = nullptr; } diff --git a/common/network/network_packet.hpp b/common/network/network_packet.hpp index 35801d5..8b5ea51 100644 --- a/common/network/network_packet.hpp +++ b/common/network/network_packet.hpp @@ -27,6 +27,8 @@ #include "SDL/SDL_net.h" +#include + #define PACKET_STRING_SIZE 100 #pragma pack(push, 0) @@ -114,4 +116,6 @@ union NetworkPacket { #pragma pack(pop) +#define PACKET_BUFFER_SIZE std::max(sizeof(NetworkPacket), REGION_WIDTH * REGION_HEIGHT * REGION_DEPTH * sizeof(Region::type_t) + sizeof(NetworkPacket::Metadata)) + #endif diff --git a/common/network/serial.cpp b/common/network/serial.cpp index c6f263b..bb2cf1a 100644 --- a/common/network/serial.cpp +++ b/common/network/serial.cpp @@ -76,6 +76,14 @@ void serializePlayer(NetworkPacket* packet, char* buffer) { memcpy(buffer, &packet->playerInfo.motion.y, sizeof(double)); } +void serializeRegion(NetworkPacket* packet, char* buffer) { +// cout << "serializeRegion" << endl; + memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + + //TODO +} + //------------------------- //internal deserialization functions //------------------------- @@ -126,6 +134,14 @@ void deserializePlayer(NetworkPacket* packet, char* buffer) { memcpy(&packet->playerInfo.motion.y, buffer, sizeof(double)); } +void deserializeRegion(NetworkPacket* packet, char* buffer) { +// cout << "deserializeRegion" << endl; + memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + + //TODO +} + //------------------------- //the interface functions //------------------------- @@ -160,6 +176,11 @@ void serialize(NetworkPacket* packet, void* buffer) { case NetworkPacket::Type::PLAYER_UPDATE: serializePlayer(packet, reinterpret_cast(buffer)); break; + + //map info + case NetworkPacket::Type::REGION_CONTENT: + serializeRegion(packet, reinterpret_cast(buffer)); + break; } // for (int i = 0; i < sizeof(NetworkPacket); i++) { // cout << ((char*)(buffer))[i]; @@ -199,6 +220,11 @@ void deserialize(NetworkPacket* packet, void* buffer) { case NetworkPacket::Type::PLAYER_UPDATE: deserializePlayer(packet, reinterpret_cast(buffer)); break; + + //map info + case NetworkPacket::Type::REGION_CONTENT: + serializeRegion(packet, reinterpret_cast(buffer)); + break; } // for (int i = 0; i < sizeof(NetworkPacket); i++) { // cout << ((char*)(buffer))[i]; diff --git a/server/server_application.cpp b/server/server_application.cpp index 84ff4ea..a126280 100644 --- a/server/server_application.cpp +++ b/server/server_application.cpp @@ -66,7 +66,7 @@ void ServerApplication::Init(int argc, char** argv) { if (SDLNet_Init()) { throw(runtime_error("Failed to initialize SDL_net")); } - network.Open(config.Int("server.port"), sizeof(NetworkPacket)); + network.Open(config.Int("server.port"), PACKET_BUFFER_SIZE); cout << "Initialized SDL_net" << endl; //Init SQL @@ -105,6 +105,7 @@ void ServerApplication::Init(int argc, char** argv) { // with the map system as needed. cout << "Initialized the map system" << endl; cout << "\tsizeof(NetworkPacket): " << sizeof(NetworkPacket) << endl; + cout << "\tPACKET_BUFFER_SIZE: " << PACKET_BUFFER_SIZE << endl; //finalize the startup cout << "Startup completed successfully" << endl; @@ -189,9 +190,9 @@ void ServerApplication::HandleBroadcastRequest(NetworkPacket packet) { //TODO: version info snprintf(packet.serverInfo.name, PACKET_STRING_SIZE, "%s", config["server.name"].c_str()); //TODO: player count - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; serialize(&packet, buffer); - network.Send(&packet.meta.srcAddress, buffer, sizeof(NetworkPacket)); + network.Send(&packet.meta.srcAddress, buffer, PACKET_BUFFER_SIZE); } void ServerApplication::HandleJoinRequest(NetworkPacket packet) { @@ -201,13 +202,13 @@ void ServerApplication::HandleJoinRequest(NetworkPacket packet) { clientMap[clientCounter] = c; //send the client their info - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; packet.meta.type = NetworkPacket::Type::JOIN_RESPONSE; packet.clientInfo.index = clientCounter; serialize(&packet, buffer); - network.Send(&clientMap[clientCounter].address, buffer, sizeof(NetworkPacket)); + network.Send(&clientMap[clientCounter].address, buffer, PACKET_BUFFER_SIZE); //finished this routine clientCounter++; @@ -217,9 +218,9 @@ void ServerApplication::HandleJoinRequest(NetworkPacket packet) { void ServerApplication::HandleDisconnect(NetworkPacket packet) { //disconnect the specified client //TODO: authenticate who is disconnecting/kicking - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; serialize(&packet, buffer); - network.Send(&clientMap[packet.clientInfo.index].address, buffer, sizeof(NetworkPacket)); + network.Send(&clientMap[packet.clientInfo.index].address, buffer, PACKET_BUFFER_SIZE); clientMap.erase(packet.clientInfo.index); //delete players from all clients @@ -245,7 +246,7 @@ void ServerApplication::HandleSynchronize(NetworkPacket packet) { //send all the server's data to this client //TODO: compensate for large distances NetworkPacket newPacket; - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; //players newPacket.meta.type = NetworkPacket::Type::PLAYER_UPDATE; @@ -256,7 +257,7 @@ void ServerApplication::HandleSynchronize(NetworkPacket packet) { newPacket.playerInfo.position = it.second.position; newPacket.playerInfo.motion = it.second.motion; serialize(&newPacket, buffer); - network.Send(&clientMap[packet.clientInfo.index].address, buffer, sizeof(NetworkPacket)); + network.Send(&clientMap[packet.clientInfo.index].address, buffer, PACKET_BUFFER_SIZE); } } @@ -334,9 +335,9 @@ void ServerApplication::HandlePlayerUpdate(NetworkPacket packet) { void ServerApplication::PumpPacket(NetworkPacket packet) { //I don't really like this, but it'll do for now - char buffer[sizeof(NetworkPacket)]; + char buffer[PACKET_BUFFER_SIZE]; serialize(&packet, buffer); for (auto& it : clientMap) { - network.Send(&it.second.address, buffer, sizeof(NetworkPacket)); + network.Send(&it.second.address, buffer, PACKET_BUFFER_SIZE); } }