functional

This commit is contained in:
Nishi 2026-01-30 00:36:12 +09:00
commit 2d27818e26
Signed by: nishi
GPG key ID: 27EF69B208EB9343
5 changed files with 40 additions and 4 deletions

View file

@ -56,6 +56,8 @@ GSDECL void GSNetPacketWrite(GSNetSocket sock, GSNetPacket* packet, GSNetAddress
/* net_state.c */ /* net_state.c */
GSDECL void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address); GSDECL void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
GSDECL void GSNetStateWrite(GSNetState* state, GSNetSocket sock, 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 #ifdef __cplusplus
} }

View file

@ -162,6 +162,8 @@ struct _GSNetState {
GSBinary* rx; GSBinary* rx;
GSBinary* tx; GSBinary* tx;
GSBinary buffer;
void* opaque; void* opaque;
}; };

View file

@ -19,8 +19,8 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
return NULL; return NULL;
} }
GSNetStateInit(&net->state, client->engine);
strcpy(net->state.name, "Client"); strcpy(net->state.name, "Client");
net->state.engine = net->engine;
return net; return net;
} }

View file

@ -35,7 +35,7 @@ void GSNetServerStep(GSNetServer net) {
GSNetState v; GSNetState v;
memset(&v, 0, sizeof(v)); memset(&v, 0, sizeof(v));
v.engine = net->engine; GSNetStateInit(&v, net->engine);
strcpy(v.name, "Server"); strcpy(v.name, "Server");
hmput(net->client, addr, v); hmput(net->client, addr, v);

View file

@ -30,6 +30,7 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
state->txseq = 0; state->txseq = 0;
state->txindex++; state->txindex++;
free(state->tx[0].data);
arrdel(state->tx, 0); arrdel(state->tx, 0);
} }
} }
@ -40,12 +41,21 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
if(state->rxseq == 0) { if(state->rxseq == 0) {
state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data); 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++; state->rxseq++;
if(state->rxseq == (state->rxtotal + 1)) { if(state->rxseq == (state->rxtotal + 1)) {
arrput(state->rx, state->buffer);
state->buffer.data = NULL;
state->rxseq = 0; state->rxseq = 0;
state->rxindex++; state->rxindex++;
} }
@ -79,6 +89,7 @@ void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address)
GSNetPacketWrite(sock, &pkt, address); GSNetPacketWrite(sock, &pkt, address);
free(state->tx[i].data);
arrdel(state->tx, i); arrdel(state->tx, i);
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);
}