summaryrefslogtreecommitdiffstats
path: root/doc
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-11-22 10:32:53 -0500
committerSam Anthony <sam@samanthony.xyz>2024-11-22 10:32:53 -0500
commit91967cbd407254358ab768e74ebcfda8d4a30bc8 (patch)
tree0e1e098e0bb63a68efb1164fcc4d4c6dd6f0e45f /doc
parentf107ea8af0e83d505022e934805bb096e636acff (diff)
downloadsoen423-91967cbd407254358ab768e74ebcfda8d4a30bc8.zip
reliable unicast pseudocode
Diffstat (limited to 'doc')
-rw-r--r--doc/runicast.pseudo67
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()
+ }
+}