eolib 0.5.0
A core C library for writing applications related to Endless Online
Loading...
Searching...
No Matches
Packet Sequencing

EO embeds a sequence number in every client packet to detect out-of-order or replayed packets. The sequence start is established during the handshake and then increments by one per packet, wrapping every 10 steps.

Initialization from a server init packet:

// Server sends two bytes (seq1, seq2) that encode the start value.
int32_t seq1 = ...; // from ServerInitInitPacket
int32_t seq2 = ...; // from ServerInitInitPacket
int32_t start = eo_sequence_start_from_init(seq1, seq2);
EoSequencer sequencer = eo_sequencer_init(start);
int32_t eo_sequence_start_from_init(int32_t s1, int32_t s2)
Definition sequencer.c:34
EoSequencer eo_sequencer_init(int32_t start)
Definition sequencer.c:5

Re-synchronisation from a server ping packet:

int32_t seq1 = ...; // from server ping
int32_t seq2 = ...; // from server ping
int32_t start = eo_sequence_start_from_ping(seq1, seq2);
sequencer = eo_sequencer_init(start);
int32_t eo_sequence_start_from_ping(int32_t s1, int32_t s2)
Definition sequencer.c:41

Stamping outgoing packets:

int32_t seq;
eo_sequencer_next(&sequencer, &seq);
eo_writer_add_char(&writer, seq); // written into the packet header
EoResult eo_writer_add_char(EoWriter *writer, int32_t value)
Definition data.c:440
EoResult eo_sequencer_next(EoSequencer *sequencer, int32_t *out_value)
Definition sequencer.c:13

Server-side: generating and encoding a new start:

int32_t start = eo_generate_sequence_start();
uint8_t bytes[2];
if (eo_sequence_init_bytes(start, bytes) == EO_SUCCESS) {
// Send bytes[0] and bytes[1] in the init packet.
}
EoSequencer sequencer = eo_sequencer_init(start);
@ EO_SUCCESS
Definition result.h:14
int32_t eo_generate_sequence_start(void)
Definition sequencer.c:29
EoResult eo_sequence_init_bytes(int32_t start, uint8_t *out_bytes)
Definition sequencer.c:46