aboutsummaryrefslogtreecommitdiff
path: root/musw.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2023-02-21 22:18:56 +0000
committerrodri <rgl@antares-labs.eu>2023-02-21 22:18:56 +0000
commitecc7d34e9229524a8d4340f0e127f1421029141c (patch)
treeb1e1a9dea5f4a31da7a87826d698b709419a5309 /musw.c
parentfd5dc301e4a69d7b7c1293aafe5b069b4ff400a4 (diff)
downloadmusw-ecc7d34e9229524a8d4340f0e127f1421029141c.tar.gz
musw-ecc7d34e9229524a8d4340f0e127f1421029141c.tar.bz2
musw-ecc7d34e9229524a8d4340f0e127f1421029141c.zip
take the packet seq and ack into account during connection setup. added a player queue to keep clients around waiting for a party.
Diffstat (limited to 'musw.c')
-rw-r--r--musw.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/musw.c b/musw.c
index 08d1272..25acdb0 100644
--- a/musw.c
+++ b/musw.c
@@ -151,7 +151,7 @@ initconn(void)
{
Frame *frame;
- frame = newframe(nil, NChi, 0, 0, 0, nil);
+ frame = newframe(nil, NChi, ntruerand(1000), 0, 0, nil);
sendp(egress, frame);
netconn.state = NCSConnecting;
}
@@ -164,7 +164,7 @@ sendkeys(ulong kdown)
if(netconn.state != NCSConnected)
return;
- frame = newframe(nil, NCinput, 0, 0, sizeof(kdown), nil);
+ frame = newframe(nil, NCinput, netconn.lastseq+1, 0, sizeof(kdown), nil);
pack(frame->data, frame->len, "k", kdown);
signframe(frame, netconn.dh.priv);
sendp(egress, frame);
@@ -264,6 +264,10 @@ threadnetppu(void *)
switch(netconn.state){
case NCSConnecting:
+ if(frame->seq != netconn.lastseq + 1 &&
+ frame->ack != netconn.lastseq)
+ goto discard;
+
switch(frame->type){
case NShi:
unpack(frame->data, frame->len, "kk", &netconn.dh.p, &netconn.dh.g);
@@ -316,6 +320,9 @@ threadnetppu(void *)
}
break;
}
+
+ netconn.lastseq = frame->seq;
+ netconn.lastack = frame->ack;
discard:
delframe(frame);
}
@@ -345,7 +352,10 @@ threadnetsend(void *arg)
frame->udp.laddr, lport, frame->udp.raddr, rport, frame);
}
- free(frame);
+ netconn.lastseq = frame->seq;
+ netconn.lastack = frame->ack;
+
+ delframe(frame);
}
}
@@ -386,6 +396,14 @@ darkness:
}
void
+drawconnecting(void)
+{
+ draw(screen, screen->r, display->black, nil, ZP);
+ string(screen, addpt(screen->r.min, Pt(100,300)), display->white, ZP, font, "connecting...");
+ flushimage(display, 1);
+}
+
+void
redraw(void)
{
lockdisplay(display);
@@ -472,10 +490,10 @@ threadmain(int argc, char *argv[])
screenrf.bx = Vec2(1, 0);
screenrf.by = Vec2(0,-1);
- proccreate(kbdproc, nil, 4096);
+ proccreate(kbdproc, nil, mainstacksize);
- /* TODO: draw a CONNECTING... sign */
- /* TODO: set up an alarm for n secs and update the sign */
+ /* TODO: implement this properly with screens and iodial(2) */
+ drawconnecting();
fd = dial(server, nil, nil, nil);
if(fd < 0)
sysfatal("dial: %r");