From 6a204643f692c445b013183d7830af54d8818ec0 Mon Sep 17 00:00:00 2001 From: Kayne Ruse Date: Fri, 7 Mar 2014 20:17:11 +1100 Subject: [PATCH] Serialization is finally functional --- client/scenes/in_world.cpp | 2 +- common/network/serial.cpp | 133 +++++++++++++++++++++++++++---------- 2 files changed, 98 insertions(+), 37 deletions(-) diff --git a/client/scenes/in_world.cpp b/client/scenes/in_world.cpp index 9a8ba5b..c316ae8 100644 --- a/client/scenes/in_world.cpp +++ b/client/scenes/in_world.cpp @@ -91,7 +91,7 @@ void InWorld::Update(double delta) { //suck in all waiting packets NetworkPacket packet; while(network.Receive()) { - memcpy(&packet, network.GetInData(), sizeof(NetworkPacket)); + deserialize(&packet, network.GetInData()); packet.meta.srcAddress = network.GetInPacket()->address; HandlePacket(packet); } diff --git a/common/network/serial.cpp b/common/network/serial.cpp index 29f46e1..24e802c 100644 --- a/common/network/serial.cpp +++ b/common/network/serial.cpp @@ -22,55 +22,108 @@ #include "serial.hpp" #include -#include -using namespace std; +//#include + +//using namespace std; //------------------------- //internal serialization functions //------------------------- -void serializeType(NetworkPacket* packet, void* buffer) { +void serializeType(NetworkPacket* packet, char* buffer) { +// cout << "serializeType" << endl; memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); } -void serializeServer(NetworkPacket* packet, void* buffer) { - int len = 0; - memcpy((void*)((int)buffer + len), &packet->meta.type, sizeof(NetworkPacket::Type)); - len += sizeof(NetworkPacket::Type); - memcpy((void*)((int)buffer + len), packet->serverInfo.name, PACKET_STRING_SIZE); - len += PACKET_STRING_SIZE; +void serializeServer(NetworkPacket* packet, char* buffer) { +// cout << "serializeServer" << endl; + memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + memcpy(buffer, packet->serverInfo.name, PACKET_STRING_SIZE); } -void serializeClient(NetworkPacket* packet, void* buffer) { - //TODO +void serializeClient(NetworkPacket* packet, char* buffer) { +// cout << "serializeClient" << endl; + memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + memcpy(buffer, &packet->clientInfo.index, sizeof(int)); } -void serializePlayer(NetworkPacket* packet, void* buffer) { - //TODO +void serializePlayer(NetworkPacket* packet, char* buffer) { +// cout << "serializePlayer" << endl; + memcpy(buffer, &packet->meta.type, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + + //indexes + memcpy(buffer, &packet->playerInfo.clientIndex, sizeof(int)); + buffer += sizeof(int); + memcpy(buffer, &packet->playerInfo.playerIndex, sizeof(int)); + buffer += sizeof(int); + + //text + memcpy(buffer, packet->playerInfo.handle, PACKET_STRING_SIZE); + buffer += PACKET_STRING_SIZE; + memcpy(buffer, packet->playerInfo.avatar, PACKET_STRING_SIZE); + buffer += PACKET_STRING_SIZE; + + //vectors + memcpy(buffer, &packet->playerInfo.position.x, sizeof(double)); + buffer += sizeof(double); + memcpy(buffer, &packet->playerInfo.position.y, sizeof(double)); + buffer += sizeof(double); + memcpy(buffer, &packet->playerInfo.motion.x, sizeof(double)); + buffer += sizeof(double); + memcpy(buffer, &packet->playerInfo.motion.y, sizeof(double)); } //------------------------- //internal deserialization functions //------------------------- -void deserializeType(NetworkPacket* packet, void* buffer) { +void deserializeType(NetworkPacket* packet, char* buffer) { +// cout << "deserializeType" << endl; memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); } -void deserializeServer(NetworkPacket* packet, void* buffer) { - int len = 0; - memcpy(&packet->meta.type, (void*)((int)buffer + len), sizeof(NetworkPacket::Type)); - len += sizeof(NetworkPacket::Type); - memcpy(packet->serverInfo.name, (void*)((int)buffer + len), PACKET_STRING_SIZE); - len += PACKET_STRING_SIZE; +void deserializeServer(NetworkPacket* packet, char* buffer) { +// cout << "deserializeServer" << endl; + memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + memcpy(packet->serverInfo.name, buffer, PACKET_STRING_SIZE); } -void deserializeClient(NetworkPacket* packet, void* buffer) { - //TODO +void deserializeClient(NetworkPacket* packet, char* buffer) { +// cout << "deserializeClient" << endl; + memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + memcpy(&packet->clientInfo.index, buffer, sizeof(int)); } -void deserializePlayer(NetworkPacket* packet, void* buffer) { - //TODO +void deserializePlayer(NetworkPacket* packet, char* buffer) { +// cout << "deserializePlayer" << endl; + memcpy(&packet->meta.type, buffer, sizeof(NetworkPacket::Type)); + buffer += sizeof(NetworkPacket::Type); + + //indexes + memcpy(&packet->playerInfo.clientIndex, buffer, sizeof(int)); + buffer += sizeof(int); + memcpy(&packet->playerInfo.playerIndex, buffer, sizeof(int)); + buffer += sizeof(int); + + //text + memcpy(packet->playerInfo.handle, buffer, PACKET_STRING_SIZE); + buffer += PACKET_STRING_SIZE; + memcpy(packet->playerInfo.avatar, buffer, PACKET_STRING_SIZE); + buffer += PACKET_STRING_SIZE; + + //vectors + memcpy(&packet->playerInfo.position.x, buffer, sizeof(double)); + buffer += sizeof(double); + memcpy(&packet->playerInfo.position.y, buffer, sizeof(double)); + buffer += sizeof(double); + memcpy(&packet->playerInfo.motion.x, buffer, sizeof(double)); + buffer += sizeof(double); + memcpy(&packet->playerInfo.motion.y, buffer, sizeof(double)); } //------------------------- @@ -78,7 +131,6 @@ void deserializePlayer(NetworkPacket* packet, void* buffer) { //------------------------- void serialize(NetworkPacket* packet, void* buffer) { - cout << (int)packet->meta.type << endl; switch(packet->meta.type) { //No extra data case NetworkPacket::Type::NONE: @@ -86,33 +138,38 @@ void serialize(NetworkPacket* packet, void* buffer) { case NetworkPacket::Type::PONG: case NetworkPacket::Type::BROADCAST_REQUEST: case NetworkPacket::Type::JOIN_REQUEST: + case NetworkPacket::Type::SYNCHRONIZE: case NetworkPacket::Type::SHUTDOWN: - serializeType(packet, buffer); + serializeType(packet, reinterpret_cast(buffer)); break; //Server info case NetworkPacket::Type::BROADCAST_RESPONSE: - serializeServer(packet, buffer); + serializeServer(packet, reinterpret_cast(buffer)); break; //Client info case NetworkPacket::Type::JOIN_RESPONSE: case NetworkPacket::Type::DISCONNECT: - case NetworkPacket::Type::SYNCHRONIZE: - serializeClient(packet, buffer); + serializeClient(packet, reinterpret_cast(buffer)); break; //Player info case NetworkPacket::Type::PLAYER_NEW: case NetworkPacket::Type::PLAYER_DELETE: case NetworkPacket::Type::PLAYER_UPDATE: - serializePlayer(packet, buffer); + serializePlayer(packet, reinterpret_cast(buffer)); break; } +// for (int i = 0; i < sizeof(NetworkPacket); i++) { +// cout << ((char*)(buffer))[i]; +// } +// cout << endl; } void deserialize(NetworkPacket* packet, void* buffer) { - cout << (int)packet->meta.type << endl; + //find the type, so that you can actually deserialize the packet! + deserializeType(packet, reinterpret_cast(buffer)); switch(packet->meta.type) { //No extra data case NetworkPacket::Type::NONE: @@ -120,27 +177,31 @@ void deserialize(NetworkPacket* packet, void* buffer) { case NetworkPacket::Type::PONG: case NetworkPacket::Type::BROADCAST_REQUEST: case NetworkPacket::Type::JOIN_REQUEST: + case NetworkPacket::Type::SYNCHRONIZE: case NetworkPacket::Type::SHUTDOWN: - deserializeType(packet, buffer); + // break; //Server info case NetworkPacket::Type::BROADCAST_RESPONSE: - deserializeServer(packet, buffer); + deserializeServer(packet, reinterpret_cast(buffer)); break; //Client info case NetworkPacket::Type::JOIN_RESPONSE: case NetworkPacket::Type::DISCONNECT: - case NetworkPacket::Type::SYNCHRONIZE: - deserializeClient(packet, buffer); + deserializeClient(packet, reinterpret_cast(buffer)); break; //Player info case NetworkPacket::Type::PLAYER_NEW: case NetworkPacket::Type::PLAYER_DELETE: case NetworkPacket::Type::PLAYER_UPDATE: - deserializePlayer(packet, buffer); + deserializePlayer(packet, reinterpret_cast(buffer)); break; } +// for (int i = 0; i < sizeof(NetworkPacket); i++) { +// cout << ((char*)(buffer))[i]; +// } +// cout << endl; } \ No newline at end of file