From ecc7d34e9229524a8d4340f0e127f1421029141c Mon Sep 17 00:00:00 2001 From: rodri Date: Tue, 21 Feb 2023 22:18:56 +0000 Subject: take the packet seq and ack into account during connection setup. added a player queue to keep clients around waiting for a party. --- musw.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) (limited to 'musw.c') 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); } } @@ -385,6 +395,14 @@ darkness: close(fd); } +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) { @@ -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"); -- cgit v1.2.3