Quick answer: Keep UDP payloads under 1200 bytes. Length-prefix every packet (4-byte size header). For larger messages, split into chunks with a sequence number and reassemble on receive.
Multiplayer game sends a 4 KB world snapshot. Some clients miss every snapshot — their network MTU drops large packets.
The Symptom
Players on certain ISPs see network desync. Smaller messages work fine; large state updates don’t arrive.
The Fix
/// Send chunked, length-prefixed
var buf = buffer_create(2048, buffer_grow, 1);
buffer_write(buf, buffer_u32, message_id);
buffer_write(buf, buffer_u16, payload_size);
buffer_write(buf, buffer_text, payload);
var total = buffer_get_size(buf);
var CHUNK = 1100; // safe under MTU
if (total <= CHUNK) {
network_send_udp(socket, ip, port, buf, total);
} else {
var chunks = ceil(total / CHUNK);
for (var i = 0; i < chunks; ++i) {
var chunk_buf = buffer_create(CHUNK + 8, buffer_fixed, 1);
buffer_write(chunk_buf, buffer_u32, message_id);
buffer_write(chunk_buf, buffer_u16, i);
buffer_write(chunk_buf, buffer_u16, chunks);
// copy slice
// ...
network_send_udp(socket, ip, port, chunk_buf, buffer_get_size(chunk_buf));
buffer_delete(chunk_buf);
}
}
Header carries message id + chunk index + total chunks. Receiver assembles when all chunks arrive.
Receive and Reassemble
Maintain a Dictionary keyed on message_id holding partial chunks. When all chunks present, concatenate and dispatch. Drop with timeout if some never arrive.
Verifying
Send a 4KB message. Wireshark should show 4 chunks of ~1100 bytes each. Receiver reassembles. Without chunking, a single 4KB UDP packet may not even leave certain networks.
“Length prefix. Chunk under MTU. Reassemble on receive. Big messages arrive.”
Related Issues
For buffer UTF-8, see UTF-8 buffer. For surface lost, see surface lost.
Under MTU. Sequence headers. Reassemble.