summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/network/core/packet.cpp15
-rw-r--r--src/network/core/packet.h15
-rw-r--r--src/network/network_server.cpp8
3 files changed, 26 insertions, 12 deletions
diff --git a/src/network/core/packet.cpp b/src/network/core/packet.cpp
index 6e6bb51c0..c033aec98 100644
--- a/src/network/core/packet.cpp
+++ b/src/network/core/packet.cpp
@@ -175,6 +175,21 @@ void Packet::Send_string(const char *data)
while ((this->buffer[this->size++] = *data++) != '\0') {}
}
+/**
+ * Send as many of the bytes as possible in the packet. This can mean
+ * that it is possible that not all bytes are sent. To cope with this
+ * the function returns the amount of bytes that were actually sent.
+ * @param begin The begin of the buffer to send.
+ * @param end The end of the buffer to send.
+ * @return The number of bytes that were added to this packet.
+ */
+size_t Packet::Send_bytes(const byte *begin, const byte *end)
+{
+ size_t amount = std::min<size_t>(end - begin, SEND_MTU - this->size);
+ memcpy(this->buffer + this->size, begin, amount);
+ this->size += static_cast<PacketSize>(amount);
+ return amount;
+}
/*
* Receiving commands
diff --git a/src/network/core/packet.h b/src/network/core/packet.h
index b091d8a7e..4eb4703c1 100644
--- a/src/network/core/packet.h
+++ b/src/network/core/packet.h
@@ -65,13 +65,14 @@ public:
/* Sending/writing of packets */
void PrepareToSend();
- bool CanWriteToPacket(size_t bytes_to_write);
- void Send_bool (bool data);
- void Send_uint8 (uint8 data);
- void Send_uint16(uint16 data);
- void Send_uint32(uint32 data);
- void Send_uint64(uint64 data);
- void Send_string(const char *data);
+ bool CanWriteToPacket(size_t bytes_to_write);
+ void Send_bool (bool data);
+ void Send_uint8 (uint8 data);
+ void Send_uint16(uint16 data);
+ void Send_uint32(uint32 data);
+ void Send_uint64(uint64 data);
+ void Send_string(const char *data);
+ size_t Send_bytes (const byte *begin, const byte *end);
/* Reading/receiving of packets */
bool HasPacketSizeData() const;
diff --git a/src/network/network_server.cpp b/src/network/network_server.cpp
index fbde713eb..9b77a57af 100644
--- a/src/network/network_server.cpp
+++ b/src/network/network_server.cpp
@@ -174,12 +174,10 @@ struct PacketWriter : SaveFilter {
byte *bufe = buf + size;
while (buf != bufe) {
- size_t to_write = std::min<size_t>(SEND_MTU - this->current->size, bufe - buf);
- memcpy(this->current->buffer + this->current->size, buf, to_write);
- this->current->size += (PacketSize)to_write;
- buf += to_write;
+ size_t written = this->current->Send_bytes(buf, bufe);
+ buf += written;
- if (this->current->size == SEND_MTU) {
+ if (!this->current->CanWriteToPacket(1)) {
this->AppendQueue();
if (buf != bufe) this->current = new Packet(PACKET_SERVER_MAP_DATA);
}