diff --git a/data/mdl/crate.gsm b/data/mdl/crate.gsm index ebc5c97..6172778 100644 Binary files a/data/mdl/crate.gsm and b/data/mdl/crate.gsm differ diff --git a/data/mdl/fish.gsm b/data/mdl/fish.gsm index 028436e..b080492 100644 Binary files a/data/mdl/fish.gsm and b/data/mdl/fish.gsm differ 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