implement unsafe packet and etc

This commit is contained in:
Nishi 2026-01-30 01:24:14 +09:00
commit 7993a64720
Signed by: nishi
GPG key ID: 27EF69B208EB9343
4 changed files with 67 additions and 25 deletions

View file

@ -54,10 +54,13 @@ GSDECL void GSNetPacketRead(GSNetSocket sock, GSNetPacket* packet, GSNetAddress*
GSDECL void GSNetPacketWrite(GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
/* 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);
GSDECL void GSNetStateCheckRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
GSDECL void GSNetStateCheckWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address);
GSDECL void GSNetStateInit(GSNetState* state, GSEngine engine);
GSDECL void GSNetStateDeinit(GSNetState* state);
GSDECL GSBool GSNetStateRead(GSNetState* state, void** data, int* size); /* remember to free what gets returned in data! */
GSDECL void GSNetStateWrite(GSNetState* state, void* data, int size);
GSDECL void GSNetStateWriteUnsafe(GSNetState* state, void* data, int size);
#ifdef __cplusplus
}

View file

@ -22,6 +22,8 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
GSNetStateInit(&net->state, client->engine);
strcpy(net->state.name, "Client");
GSNetStateWriteUnsafe(&net->state, "Hello", 5);
return net;
}
@ -31,10 +33,10 @@ void GSNetClientStep(GSNetClient net) {
do {
while(GSNetBaseHasData(net->sock)) {
GSNetPacketRead(net->sock, &pkt, &net->address);
GSNetStateRead(&net->state, net->sock, &pkt, &net->address);
GSNetStateCheckRead(&net->state, net->sock, &pkt, &net->address);
}
GSNetStateWrite(&net->state, net->sock, &net->address);
GSNetStateCheckWrite(&net->state, net->sock, &net->address);
} while(GSNetBaseHasData(net->sock));
}

View file

@ -43,11 +43,11 @@ void GSNetServerStep(GSNetServer net) {
i = hmgeti(net->client, addr);
}
GSNetStateRead(&net->client[i].value, net->sock, &pkt, &addr);
GSNetStateCheckRead(&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);
GSNetStateCheckWrite(&net->client[i].value, net->sock, &net->client[i].key);
}
} while(GSNetBaseHasData(net->sock));
}

View file

@ -10,10 +10,12 @@ enum states {
WaitingAcknowledge
};
void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address) {
void GSNetStateCheckRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address) {
if(packet->header.flag & GSNetPacketFlagUnsafe) {
GSBinary binary;
GSLog(state->engine, GSLogDebug, "%s: Received unsafe packet", state->name);
binary.size = 508 - sizeof(packet->header);
binary.data = malloc(binary.size);
@ -73,28 +75,30 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
}
}
void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) {
if(arrlen(state->tx) > 0) {
int i;
for(i = 0; i < arrlen(state->tx); i++) {
if(state->tx[i].flag & GSNetPacketFlagUnsafe) {
GSNetPacket pkt;
void GSNetStateCheckWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) {
int i;
for(i = 0; i < arrlen(state->tx); i++) {
if(state->tx[i].flag & GSNetPacketFlagUnsafe) {
GSNetPacket pkt;
pkt.header.flag = GSNetPacketFlagUnsafe;
pkt.header.index = 0;
pkt.header.seq = 0;
pkt.size = state->tx[i].size;
pkt.header.flag = GSNetPacketFlagUnsafe;
pkt.header.index = 0;
pkt.header.seq = 0;
pkt.size = state->tx[i].size;
memcpy(pkt.data, state->tx[i].data, pkt.size);
memcpy(pkt.data, state->tx[i].data, pkt.size);
GSNetPacketWrite(sock, &pkt, address);
GSNetPacketWrite(sock, &pkt, address);
free(state->tx[i].data);
arrdel(state->tx, i);
i--;
}
free(state->tx[i].data);
arrdel(state->tx, i);
i--;
GSLog(state->engine, GSLogDebug, "%s: Sent unsafe packet", state->name);
}
}
if(arrlen(state->tx) > 0) {
if(state->txstate == Acknowledged) {
int n = state->tx[0].size;
GSNetPacket pkt;
@ -159,3 +163,36 @@ void GSNetStateDeinit(GSNetState* state) {
if(state->buffer.data != NULL) free(state->buffer.data);
}
GSBool GSNetStateRead(GSNetState* state, void** data, int* size) {
if(arrlen(state->tx) <= 0) return GSFalse;
*data = state->rx[0].data;
*size = state->rx[0].size;
arrdel(state->rx, 0);
return GSTrue;
}
void GSNetStateWrite(GSNetState* state, void* data, int size) {
GSBinary buffer;
buffer.flag = 0;
buffer.size = size;
buffer.data = malloc(buffer.size);
memcpy(buffer.data, data, buffer.size);
arrput(state->tx, buffer);
}
void GSNetStateWriteUnsafe(GSNetState* state, void* data, int size) {
GSBinary buffer;
buffer.flag = GSNetPacketFlagUnsafe;
buffer.size = size;
buffer.data = malloc(buffer.size);
memcpy(buffer.data, data, buffer.size);
arrput(state->tx, buffer);
}