diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-11-22 10:32:53 -0500 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-11-22 10:32:53 -0500 |
| commit | 91967cbd407254358ab768e74ebcfda8d4a30bc8 (patch) | |
| tree | 0e1e098e0bb63a68efb1164fcc4d4c6dd6f0e45f /doc | |
| parent | f107ea8af0e83d505022e934805bb096e636acff (diff) | |
| download | soen423-91967cbd407254358ab768e74ebcfda8d4a30bc8.zip | |
reliable unicast pseudocode
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/runicast.pseudo | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/doc/runicast.pseudo b/doc/runicast.pseudo new file mode 100644 index 0000000..1721025 --- /dev/null +++ b/doc/runicast.pseudo @@ -0,0 +1,67 @@ +type Message[T] struct { + seq int + data T +} + +type Ack int + +class sender[T] { + const ackTimeout = 500ms + + var ( + next := 0 // Next sequence number. + unacked := 0 // Sequence number of first unacked message. + sent Queue[Message[T]] + sock Socket + ) + + func send(data) { + msg := Message{next, data} + sock.send(msg) + sent.add(msg) + next++ + } + + thread retransmit() { + wait(ackTimeout) + + if unacked < next { + forall msg in sent s.t. msg.seq >= unacked { + sock.send(msg) + } + } + } + + thread recvAcks() { + ack := sock.receive() + + if ack >= unacked { + unacked = ack+1 + } + + while sent.peek().seq <= ack { + sent.pop() + } + } +} + +class receiver[T] { + var ( + seq := 0 // Next sequence number. + sock Socket + delivered Queue[T] + ) + + thread recv() { + msg := sock.receive() + if msg.seq == seq { + delivered.add(msg.data) + sock.send(Ack(seq)) + seq++ + } + } + + func deliver() T { + return delivered.pop() + } +} |