From 2d27818e267ff4d1dbbc863185f06f86b2c340e2 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Fri, 30 Jan 2026 00:36:12 +0900 Subject: [PATCH] functional --- engine/include/GearSrc/Net.h | 2 ++ engine/include/GearSrc/TypeDefs.h | 2 ++ engine/src/net/net_client.c | 2 +- engine/src/net/net_server.c | 2 +- engine/src/net/net_state.c | 36 +++++++++++++++++++++++++++++-- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/engine/include/GearSrc/Net.h b/engine/include/GearSrc/Net.h index aaadcc4..7e2dbc1 100644 --- a/engine/include/GearSrc/Net.h +++ b/engine/include/GearSrc/Net.h @@ -56,6 +56,8 @@ GSDECL void GSNetPacketWrite(GSNetSocket sock, GSNetPacket* packet, GSNetAddress /* net_state.c */ GSDECL void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address); GSDECL void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address); +GSDECL void GSNetStateInit(GSNetState* state, GSEngine engine); +GSDECL void GSNetStateDeinit(GSNetState* state); #ifdef __cplusplus } diff --git a/engine/include/GearSrc/TypeDefs.h b/engine/include/GearSrc/TypeDefs.h index a31b43b..17ee0b1 100644 --- a/engine/include/GearSrc/TypeDefs.h +++ b/engine/include/GearSrc/TypeDefs.h @@ -162,6 +162,8 @@ struct _GSNetState { GSBinary* rx; GSBinary* tx; + GSBinary buffer; + void* opaque; }; diff --git a/engine/src/net/net_client.c b/engine/src/net/net_client.c index 44de31e..5bea1e2 100644 --- a/engine/src/net/net_client.c +++ b/engine/src/net/net_client.c @@ -19,8 +19,8 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) { return NULL; } + GSNetStateInit(&net->state, client->engine); strcpy(net->state.name, "Client"); - net->state.engine = net->engine; return net; } diff --git a/engine/src/net/net_server.c b/engine/src/net/net_server.c index b71c692..5f1e404 100644 --- a/engine/src/net/net_server.c +++ b/engine/src/net/net_server.c @@ -35,7 +35,7 @@ void GSNetServerStep(GSNetServer net) { GSNetState v; memset(&v, 0, sizeof(v)); - v.engine = net->engine; + GSNetStateInit(&v, net->engine); strcpy(v.name, "Server"); hmput(net->client, addr, v); diff --git a/engine/src/net/net_state.c b/engine/src/net/net_state.c index 3ca23c7..b364689 100644 --- a/engine/src/net/net_state.c +++ b/engine/src/net/net_state.c @@ -30,6 +30,7 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS state->txseq = 0; state->txindex++; + free(state->tx[0].data); arrdel(state->tx, 0); } } @@ -40,12 +41,21 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS if(state->rxseq == 0) { state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data); - } - /* TODO: buffer what it got */ + state->buffer.data = malloc(state->rxtotal * (508 - sizeof(packet->header))); + state->buffer.size = 0; + } else { + memcpy(((unsigned char*)state->buffer.data) + state->buffer.size, packet->data, packet->size); + + state->buffer.size += packet->size; + } state->rxseq++; if(state->rxseq == (state->rxtotal + 1)) { + arrput(state->rx, state->buffer); + + state->buffer.data = NULL; + state->rxseq = 0; state->rxindex++; } @@ -79,6 +89,7 @@ void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) GSNetPacketWrite(sock, &pkt, address); + free(state->tx[i].data); arrdel(state->tx, i); i--; } @@ -127,3 +138,24 @@ void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) } } } + +void GSNetStateInit(GSNetState* state, GSEngine engine) { + memset(state, 0, sizeof(*state)); + + state->engine = engine; +} + +void GSNetStateDeinit(GSNetState* state) { + int i; + for(i = 0; i < arrlen(state->rx); i++) { + free(state->rx[i].data); + } + arrfree(state->rx); + + for(i = 0; i < arrlen(state->rx); i++) { + free(state->tx[i].data); + } + arrfree(state->tx); + + if(state->buffer.data != NULL) free(state->buffer.data); +}