From f08ef9b687ef33392feada3a647a766084b7aabf Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Thu, 29 Jan 2026 20:38:17 +0900 Subject: [PATCH] seems to work --- data/mdl/crate.gsm | Bin 1591111 -> 1591111 bytes data/mdl/fish.gsm | Bin 931880 -> 931880 bytes engine/src/net/net_base.c | 1 + engine/src/net/net_client.c | 23 ++++++++++++++--------- engine/src/net/net_server.c | 31 ++++++++++++++++++------------- engine/src/net/net_state.c | 24 +++++++++++++----------- submodule/milsko | 2 +- 7 files changed, 47 insertions(+), 34 deletions(-) diff --git a/data/mdl/crate.gsm b/data/mdl/crate.gsm index ebc5c971a331de4341239aab571ff92c0ca6fa3a..61727788b6fc84fe39b7525102080934412873b6 100644 GIT binary patch delta 192 zcmX@!mw3D{(XBqf(VLM0448prAOmZ}x@nxb`6;P6dIfpu3=%pE7$jVtffXE3tIUE* z_`7GRXh{ delta 170 zcmXYnI|{;36h!ZP@fW}GA2(oWX)kCjY_zl-Q34?$jg6I9OdGJ0Y{E{&La=ia)>(%! zI51P3Gw%rR2+naiSt!Y3q`Q*w`k9zPxZU}qVDG2slQzx{ui?S_t8n9q=!b}MfBI|< zw3f@&vE%!EX1nSHLJ^uUh#Zk83Ph185hhV4Dnym25p|+LSVWU(5pAMFbcr6(zrjwX EUzm(BTmS$7 diff --git a/data/mdl/fish.gsm b/data/mdl/fish.gsm index 028436eb18ce9cb253fdd961400d98c51958c06d..b080492784a1cc8afa81eba52abe84dfd4762dce 100644 GIT binary patch delta 106 zcmZ4S!D7V+3xWCoM{h<3Fkl9fffKbQnHU%*3P>?7pXlZ>d4_P+#zZdRW+9PwArVF( nW&&bnAZ7t#Rv=~rVs;?r0Afxc<^p1FAm#yL-t9snd}1m9I;j?u delta 106 zcmZ4S!D7V+3xWCoM{h<3Fkl9fffKc*7#SuCNHPg?O?30vY|407Xky~>W+9PwArVF( nW&&bnAZ7t#Rv=~rVs;?r0Afxc<^p1FAm#yL-t9snd}1m9G$a<2 diff --git a/engine/src/net/net_base.c b/engine/src/net/net_base.c index 5ee3124..da82bf4 100644 --- a/engine/src/net/net_base.c +++ b/engine/src/net/net_base.c @@ -120,6 +120,7 @@ int GSNetBaseRead(GSNetSocket sock, void* data, int size, GSNetAddress* address) n = recvfrom(sock->fd, data, size, 0, (struct sockaddr*)&addr, &len); + memset(address, 0, sizeof(*address)); address->address = addr.sin_addr.s_addr; address->port = addr.sin_port; } diff --git a/engine/src/net/net_client.c b/engine/src/net/net_client.c index 72980cc..3207e50 100644 --- a/engine/src/net/net_client.c +++ b/engine/src/net/net_client.c @@ -21,10 +21,13 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) { net->state.engine = net->engine; - GSBinary b; - b.data = strdup("Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello world"); - b.size = strlen(b.data); - arrput(net->state.tx, b); + int i; + for(i = 0; i < 5; i++){ + GSBinary b; + b.data = malloc(512 * 5); + b.size = 512 * 5; + arrput(net->state.tx, b); + } return net; } @@ -32,12 +35,14 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) { void GSNetClientStep(GSNetClient net) { GSNetPacket pkt; - while(GSNetBaseHasData(net->sock)) { - GSNetPacketRead(net->sock, &pkt, &net->address); - GSNetStateRead(&net->state, net->sock, &pkt, &net->address); - } + do{ + while(GSNetBaseHasData(net->sock)) { + GSNetPacketRead(net->sock, &pkt, &net->address); + GSNetStateRead(&net->state, net->sock, &pkt, &net->address); + } - GSNetStateWrite(&net->state, net->sock, &net->address); + GSNetStateWrite(&net->state, net->sock, &net->address); + }while(GSNetBaseHasData(net->sock)); } void GSNetClientClose(GSNetClient net) { diff --git a/engine/src/net/net_server.c b/engine/src/net/net_server.c index 8823d70..25890ce 100644 --- a/engine/src/net/net_server.c +++ b/engine/src/net/net_server.c @@ -26,24 +26,29 @@ void GSNetServerStep(GSNetServer net) { GSNetPacket pkt; GSNetAddress addr; - while(GSNetBaseHasData(net->sock)) { - GSNetState v; + do{ + while(GSNetBaseHasData(net->sock)) { + GSNetPacketRead(net->sock, &pkt, &addr); - memset(&v, 0, sizeof(v)); - v.engine = net->engine; + i = hmgeti(net->client, addr); + if(i == -1){ + GSNetState v; - GSNetPacketRead(net->sock, &pkt, &addr); + memset(&v, 0, sizeof(v)); + v.engine = net->engine; - i = hmgeti(net->client, addr); - if(i != -1) v = net->client[i].value; + hmput(net->client, addr, v); - GSNetStateRead(&v, net->sock, &pkt, &addr); - hmput(net->client, addr, v); - } + i = hmgeti(net->client, addr); + } - for(i = 0; i < hmlen(net->client); i++) { - GSNetStateWrite(&net->client[i].value, net->sock, &net->client[i].key); - } + GSNetStateRead(&net->client[i].value, net->sock, &pkt, &addr); + } + + for(i = 0; i < hmlen(net->client); i++) { + GSNetStateWrite(&net->client[i].value, net->sock, &net->client[i].key); + } + }while(GSNetBaseHasData(net->sock)); } void GSNetServerClose(GSNetServer net) { diff --git a/engine/src/net/net_state.c b/engine/src/net/net_state.c index 1b9c3d7..8545e36 100644 --- a/engine/src/net/net_state.c +++ b/engine/src/net/net_state.c @@ -13,7 +13,7 @@ enum states { void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address) { if(packet->header.flag & GSNetPacketFlagAcknowledge) { if(arrlen(state->tx) > 0 && state->txstate == WaitingAcknowledge && state->txindex == packet->header.index && state->txseq == packet->header.seq) { - GSLog(state->engine, GSLogDebug, "Received ACK packet %d:%d", state->txindex, state->txseq); + GSLog(state->engine, GSLogDebug, "Received Acknowledge packet %d:%d", state->txindex, state->txseq); state->txstate = Acknowledged; state->txseq++; @@ -25,28 +25,30 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS } } } else { + GSNetPacket pkt; if(state->rxindex == packet->header.index && state->rxseq == packet->header.seq) { - GSNetPacket pkt; - GSLog(state->engine, GSLogDebug, "Received packet %d:%d", state->rxindex, state->rxseq); - pkt.header.flag |= GSNetPacketFlagAcknowledge; - pkt.header.index = state->rxindex; - pkt.header.seq = state->rxseq; - pkt.size = 0; - if(state->rxseq == 0) { - state->rxtotal = GSEndianSwapU32BE(*(GSU32*)pkt.data); + state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data); } - GSNetPacketWrite(sock, &pkt, address); - state->rxseq++; if(state->rxseq == (state->rxtotal + 1)) { state->rxseq = 0; state->rxindex++; } } + + /* this is to prevent netcode from blowing up when + * ACK packet goes missing... + */ + pkt.header.flag |= GSNetPacketFlagAcknowledge; + pkt.header.index = packet->header.index; + pkt.header.seq = packet->header.seq; + pkt.size = 0; + + GSNetPacketWrite(sock, &pkt, address); } } diff --git a/submodule/milsko b/submodule/milsko index bbb20f0..64c3cdb 160000 --- a/submodule/milsko +++ b/submodule/milsko @@ -1 +1 @@ -Subproject commit bbb20f081ef347f074912091e0f641b8104fc69a +Subproject commit 64c3cdb4a511b0b9efcd538a4c1bc82cbbda7dc8