diff --git a/include/Engine/Network/Client.h b/include/Engine/Network/Client.h index 4ee071d2..4efa6e28 100644 --- a/include/Engine/Network/Client.h +++ b/include/Engine/Network/Client.h @@ -119,6 +119,7 @@ private: void sendLocalPlayerTransform(); void becomePlayer(); void displayServerlist(); + void popNetworkSegmentOfHeader(Packet& packet); // Mapping Logic // Returns if local EntityID exist in map bool clientServerMapsHasEntity(EntityID clientEntityID); diff --git a/include/Engine/Network/Packet.h b/include/Engine/Network/Packet.h index a08fff64..6095e6a6 100644 --- a/include/Engine/Network/Packet.h +++ b/include/Engine/Network/Packet.h @@ -17,7 +17,8 @@ public: Packet(MessageType type); ~Packet(); void Init(MessageType type, unsigned int& packetID, - int sequenceNumber, int totalAmountOfPackets); + int sequenceNumber, int totalAmountOfPackets, + int packetGroup); // Add primitive types like int, float, char... template @@ -65,9 +66,9 @@ public: size_t DataReadSize() { return m_ReturnDataOffset; } size_t MaxSize() { return m_MaxPacketSize; } size_t HeaderSize() { return m_HeaderSize; } - size_t SequenceNumber(); - size_t SequenceLength(); - + size_t GroupIndex(); + size_t GroupSize(); + size_t PacketID(); private: char* m_Data; size_t m_ReturnDataOffset = 0; @@ -76,6 +77,13 @@ private: size_t m_HeaderSize = 0; void resizeData(); void resizeData(int size); + + size_t packetSizeOffset = 0; + size_t groupOffset = 0; + size_t groupIndexOffset = 0; + size_t groupSizeOffset = 0; + size_t messageTypeOffset = 0; + size_t packetIDOffset = 0; }; #endif \ No newline at end of file diff --git a/include/Engine/Network/Server.h b/include/Engine/Network/Server.h index 395c80c7..5d4cac51 100644 --- a/include/Engine/Network/Server.h +++ b/include/Engine/Network/Server.h @@ -82,6 +82,7 @@ private: void kick(PlayerID player); PlayerID getPlayerIDFromEndpoint(); PlayerID getPlayerIDFromEntityID(EntityID entityID); + void popNetworkSegmentOfHeader(Packet & packet); void parsePlayerTransform(Packet& packet); void parseOnInputCommand(Packet& packet); void parseClientPing(); diff --git a/include/Engine/Network/UDPClient.h b/include/Engine/Network/UDPClient.h index f662f945..94b23080 100644 --- a/include/Engine/Network/UDPClient.h +++ b/include/Engine/Network/UDPClient.h @@ -1,6 +1,6 @@ #ifndef UDPClient_h__ #define UDPClient_h__ -#include +#include #include #include "Network/NetworkClient.h" @@ -25,7 +25,8 @@ private: boost::shared_ptr m_Socket; int readBuffer(); PacketID m_SendPacketID = 0; - std::unordered_map> packetSegmentMap; + //map:(packetGroup, vector:(pair:(groupIndex, packetData))) + std::map>>> packetSegmentMap; }; #endif \ No newline at end of file diff --git a/src/Engine/Network/Client.cpp b/src/Engine/Network/Client.cpp index d05e1541..2bda83db 100644 --- a/src/Engine/Network/Client.cpp +++ b/src/Engine/Network/Client.cpp @@ -104,10 +104,7 @@ void Client::Update() void Client::parseMessageType(Packet& packet) { // Pop packetSize, sequenceNumber and packetsInSequence. - // create a packet of the correct size - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); if (messageType == -1) @@ -170,10 +167,8 @@ void Client::parseUDPConnect(Packet& packet) void Client::parseTCPConnect(Packet& packet) { LOG_INFO("Received TCP connect from server"); - // Pop packetSize, sequenceNumber and packetsInSequence. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + // Pop packetSize, group, groupIndex and groupSize. + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read packet ID @@ -213,10 +208,8 @@ void Client::parsePing() void Client::parseServerlist(Packet& packet) { - // Pop size, message type, and ID - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + // Pop packetSize, group, groupIndex and groupSize. + popNetworkSegmentOfHeader(packet); std::string address = packet.ReadString(); int port = packet.ReadPrimitive(); std::string serverName = packet.ReadString(); @@ -684,6 +677,15 @@ void Client::displayServerlist() } } +void Client::popNetworkSegmentOfHeader(Packet & packet) +{ + // Pop packetSize, group, groupIndex and groupSize. + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); +} + bool Client::clientServerMapsHasEntity(EntityID clientEntityID) { if (m_ClientIDToServerID.find(clientEntityID) != m_ClientIDToServerID.end()) { diff --git a/src/Engine/Network/Packet.cpp b/src/Engine/Network/Packet.cpp index 0838cdf4..75b69bd7 100644 --- a/src/Engine/Network/Packet.cpp +++ b/src/Engine/Network/Packet.cpp @@ -3,7 +3,7 @@ Packet::Packet(MessageType type, unsigned int& packetID) { m_Data = new char[m_MaxPacketSize]; - Init(type, packetID, 1, 1); + Init(type, packetID, 1, 1 , -1); } // Create message @@ -21,7 +21,7 @@ Packet::Packet(MessageType type) { m_Data = new char[m_MaxPacketSize]; unsigned int dummy = 0; - Init(type, dummy, 1, 1); + Init(type, dummy, 1, 1, -1); } Packet::~Packet() @@ -30,21 +30,29 @@ Packet::~Packet() } void Packet::Init(MessageType type, unsigned int & packetID, - int sequenceNumber, int totalAmountOfPackets) + int groupIndex, int packetGroupSize, int packetGroup) { m_ReturnDataOffset = 0; m_Offset = 0; // Create message header - // If you add things before here be sure to change in GetMessageType() - // SequenceNumber(), SequenceLength(), ChangePacketID() // allocate memory for size of packet, sequenceNumber and totalPacketesInSequence + packetSizeOffset = m_Offset; WritePrimitive(0); - // SequenceNumber and totalAmountOfPackets position in array is hard coded - WritePrimitive(sequenceNumber); - WritePrimitive(totalAmountOfPackets); + // packetGroup is the gorup the packet is in + groupOffset = m_Offset; + WritePrimitive(packetGroup); + // What index the packet has in the packetGroup + groupIndexOffset = m_Offset; + WritePrimitive(groupIndex); + // The total amount of packets in a packetGroup + groupSizeOffset = m_Offset; + WritePrimitive(packetGroupSize); // Add message type int messageType = static_cast(type); + messageTypeOffset = m_Offset; WritePrimitive(messageType); + // Packet ID + packetIDOffset = m_Offset; WritePrimitive(packetID); packetID++; m_HeaderSize = m_Offset; @@ -129,37 +137,41 @@ void Packet::ChangePacketID(unsigned int & packetID) { packetID = packetID + 1; // Overwrite old PacketID - memcpy(m_Data + 4 * sizeof(int), &packetID, sizeof(int)); + memcpy(m_Data + packetIDOffset, &packetID, sizeof(int)); } -void Packet::ChangeSequenceNumber(int sequenceNumber, int sequenceLength) +void Packet::ChangeSequenceNumber(int groupIndex, int groupSize) { - memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int)); - memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int)); + memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int)); + memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int)); } MessageType Packet::GetMessageType() { MessageType messagType; - memcpy(&messagType, m_Data + 3 * sizeof(int), sizeof(int)); + memcpy(&messagType, m_Data + messageTypeOffset, sizeof(int)); return messagType; } -//WritePrimitive(sequenceNumber); -//WritePrimitive(totalAmountOfPackets); - -size_t Packet::SequenceNumber() +size_t Packet::GroupIndex() { - size_t sequenceNumber; - memcpy(&sequenceNumber, m_Data + sizeof(int), sizeof(int)); - return sequenceNumber; + size_t groupIndex; + memcpy(&groupIndex, m_Data + groupIndexOffset, sizeof(int)); + return groupIndex; } -size_t Packet::SequenceLength() +size_t Packet::GroupSize() { - size_t sequenceLength; - memcpy(&sequenceLength, m_Data + 2 * sizeof(int), sizeof(int)); - return sequenceLength; + size_t groupSize; + memcpy(&groupSize, m_Data + groupSizeOffset, sizeof(int)); + return groupSize; +} + +size_t Packet::PacketID() +{ + size_t packetID; + memcpy(&packetID, m_Data + packetIDOffset, sizeof(int)); + return packetID; } void Packet::resizeData() diff --git a/src/Engine/Network/Server.cpp b/src/Engine/Network/Server.cpp index 27f0a0cb..7a2d58a8 100644 --- a/src/Engine/Network/Server.cpp +++ b/src/Engine/Network/Server.cpp @@ -109,9 +109,7 @@ void Server::parseMessageType(Packet& packet) { // Pop packetSize, sequenceNumber and packetsInSequence. // create a packet of the correct size - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read what type off message was sent from server // Read packet ID @@ -163,7 +161,6 @@ void Server::reliableBroadcast(Packet& packet) void Server::unreliableBroadcast(Packet& packet) { for (auto& kv : m_ConnectedPlayers) { - packet.ChangePacketID(kv.second.PacketID); m_Unreliable.Send(packet, kv.second); } } @@ -325,9 +322,7 @@ void Server::checkForTimeOuts() void Server::parseUDPConnect(Packet & packet) { //Pop packetSize, sequenceNumber and packetsInSequence. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read packet ID m_PreviousPacketID = m_PacketID; // Set previous packet id @@ -350,9 +345,7 @@ void Server::parseUDPConnect(Packet & packet) void Server::parseTCPConnect(Packet & packet) { // Pop packetSize, sequenceNumber and packetsInSequence. - packet.ReadPrimitive(); - packet.ReadPrimitive(); - packet.ReadPrimitive(); + popNetworkSegmentOfHeader(packet); int messageType = packet.ReadPrimitive(); // Read packet ID @@ -688,3 +681,12 @@ PlayerID Server::getPlayerIDFromEntityID(EntityID entityID) } return -1; } + +void Server::popNetworkSegmentOfHeader(Packet & packet) +{ + // Pop packetSize, group, groupIndex and groupSize. + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); + packet.ReadPrimitive(); +} \ No newline at end of file diff --git a/src/Engine/Network/UDPClient.cpp b/src/Engine/Network/UDPClient.cpp index 6c839652..30690757 100644 --- a/src/Engine/Network/UDPClient.cpp +++ b/src/Engine/Network/UDPClient.cpp @@ -39,12 +39,15 @@ int UDPClient::readBuffer() return 0; } boost::system::error_code error; - // Peek size of packet + // Peek header m_Socket->receive(boost - ::asio::buffer((void*)m_ReadBuffer, sizeof(int)), + ::asio::buffer((void*)m_ReadBuffer, 5 * sizeof(int)), boost::asio::ip::udp::socket::message_peek, error); int sizeOfPacket = 0; memcpy(&sizeOfPacket, m_ReadBuffer, sizeof(int)); + int packetID = 0; + memcpy(&packetID, m_ReadBuffer + 4 * sizeof(int), sizeof(int)); + if (sizeOfPacket > m_Socket->available()) { LOG_WARNING("UDPClient::readBuffer(): We haven't got the whole packet yet."); // return; @@ -63,7 +66,7 @@ int UDPClient::readBuffer() if (error) { //LOG_ERROR("receive: %s", error.message().c_str()); } - + // new char [sizeOfPacket] save in map with packetID as key return bytesReceived; } diff --git a/src/Engine/Network/UDPServer.cpp b/src/Engine/Network/UDPServer.cpp index 3ec5a558..6ed95fe0 100644 --- a/src/Engine/Network/UDPServer.cpp +++ b/src/Engine/Network/UDPServer.cpp @@ -43,7 +43,12 @@ void UDPServer::Send(Packet& packet, PlayerDefinition & playerDefinition) 0); packetDataSent = bytesSent - splitPacket.HeaderSize(); ++sequenceNumber; - int sizeasdasd = splitPacket.ReadPrimitive(); + int packetsise = splitPacket.ReadPrimitive(); + int groopOffset = splitPacket.ReadPrimitive(); + int groopIndes = splitPacket.ReadPrimitive(); + int groopSiseOffset = splitPacket.ReadPrimitive(); + int mezzagetype = splitPacket.ReadPrimitive(); + int pakketIDOffset = splitPacket.ReadPrimitive(); } } catch (const boost::system::system_error& e) { LOG_INFO(e.what());