diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp index c033aec98a..e32b7fad81 100644 --- a/src/network/core/packet.cpp +++ b/src/network/core/packet.cpp @@ -230,6 +230,18 @@ bool Packet::HasPacketSizeData() const return this->pos >= sizeof(PacketSize); } +/** + * Get the number of bytes in the packet. + * When sending a packet this is the size of the data up to that moment. + * When receiving a packet (before PrepareToRead) this is the allocated size for the data to be read. + * When reading a packet (after PrepareToRead) this is the full size of the packet. + * @return The packet's size. + */ +size_t Packet::Size() const +{ + return this->size; +} + /** * Reads the packet size from the raw packet and stores it in the packet->size * @return True iff the packet size seems plausible. diff --git a/src/network/core/packet.h b/src/network/core/packet.h index 4eb4703c19..b6a7ff5d31 100644 --- a/src/network/core/packet.h +++ b/src/network/core/packet.h @@ -77,6 +77,7 @@ public: /* Reading/receiving of packets */ bool HasPacketSizeData() const; bool ParsePacketSize(); + size_t Size() const; void PrepareToRead(); bool CanReadFromPacket(size_t bytes_to_read, bool close_connection = false); diff --git a/src/network/core/udp.cpp b/src/network/core/udp.cpp index 8e476f4e2b..3bd2151fe1 100644 --- a/src/network/core/udp.cpp +++ b/src/network/core/udp.cpp @@ -137,7 +137,7 @@ void NetworkUDPSocketHandler::ReceivePackets() /* If the size does not match the packet must be corrupted. * Otherwise it will be marked as corrupted later on. */ - if (!p.ParsePacketSize() || nbytes != p.size) { + if (!p.ParsePacketSize() || (size_t)nbytes != p.Size()) { DEBUG(net, 1, "received a packet with mismatching size from %s", address.GetAddressAsString().c_str()); continue; } diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp index 9b77a57afe..5301bd084c 100644 --- a/src/network/network_server.cpp +++ b/src/network/network_server.cpp @@ -247,7 +247,7 @@ Packet *ServerNetworkGameSocketHandler::ReceivePacket() /* We can receive a packet, so try that and if needed account for * the amount of received data. */ Packet *p = this->NetworkTCPSocketHandler::ReceivePacket(); - if (p != nullptr) this->receive_limit -= p->size; + if (p != nullptr) this->receive_limit -= p->Size(); return p; } @@ -1832,7 +1832,7 @@ void NetworkServer_Tick(bool send_frame) for (NetworkClientSocket *cs : NetworkClientSocket::Iterate()) { /* We allow a number of bytes per frame, but only to the burst amount * to be available for packet receiving at any particular time. */ - cs->receive_limit = std::min(cs->receive_limit + _settings_client.network.bytes_per_frame, + cs->receive_limit = std::min(cs->receive_limit + _settings_client.network.bytes_per_frame, _settings_client.network.bytes_per_frame_burst); /* Check if the speed of the client is what we can expect from a client */ diff --git a/src/network/network_server.h b/src/network/network_server.h index 77612fdc8c..4f6033fab1 100644 --- a/src/network/network_server.h +++ b/src/network/network_server.h @@ -67,7 +67,7 @@ public: uint32 last_token_frame; ///< The last frame we received the right token ClientStatus status; ///< Status of this client CommandQueue outgoing_queue; ///< The command-queue awaiting delivery - int receive_limit; ///< Amount of bytes that we can receive at this moment + size_t receive_limit; ///< Amount of bytes that we can receive at this moment struct PacketWriter *savegame; ///< Writer used to write the savegame. NetworkAddress client_address; ///< IP-address of the client (so he can be banned)