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); GSDECL void GSNetPacketWrite(GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
/* net_state.c */ /* net_state.c */
GSDECL void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address); GSDECL void GSNetStateCheckRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
GSDECL void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address); GSDECL void GSNetStateCheckWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address);
GSDECL void GSNetStateInit(GSNetState* state, GSEngine engine); GSDECL void GSNetStateInit(GSNetState* state, GSEngine engine);
GSDECL void GSNetStateDeinit(GSNetState* state); 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 #ifdef __cplusplus
} }

View file

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

View file

@ -43,11 +43,11 @@ void GSNetServerStep(GSNetServer net) {
i = hmgeti(net->client, addr); 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++) { 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)); } while(GSNetBaseHasData(net->sock));
} }

View file

@ -10,10 +10,12 @@ enum states {
WaitingAcknowledge 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) { if(packet->header.flag & GSNetPacketFlagUnsafe) {
GSBinary binary; GSBinary binary;
GSLog(state->engine, GSLogDebug, "%s: Received unsafe packet", state->name);
binary.size = 508 - sizeof(packet->header); binary.size = 508 - sizeof(packet->header);
binary.data = malloc(binary.size); 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) { void GSNetStateCheckWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) {
if(arrlen(state->tx) > 0) { int i;
int i; for(i = 0; i < arrlen(state->tx); i++) {
for(i = 0; i < arrlen(state->tx); i++) { if(state->tx[i].flag & GSNetPacketFlagUnsafe) {
if(state->tx[i].flag & GSNetPacketFlagUnsafe) { GSNetPacket pkt;
GSNetPacket pkt;
pkt.header.flag = GSNetPacketFlagUnsafe; pkt.header.flag = GSNetPacketFlagUnsafe;
pkt.header.index = 0; pkt.header.index = 0;
pkt.header.seq = 0; pkt.header.seq = 0;
pkt.size = state->tx[i].size; 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); free(state->tx[i].data);
arrdel(state->tx, i); arrdel(state->tx, i);
i--; i--;
}
GSLog(state->engine, GSLogDebug, "%s: Sent unsafe packet", state->name);
} }
}
if(arrlen(state->tx) > 0) {
if(state->txstate == Acknowledged) { if(state->txstate == Acknowledged) {
int n = state->tx[0].size; int n = state->tx[0].size;
GSNetPacket pkt; GSNetPacket pkt;
@ -159,3 +163,36 @@ void GSNetStateDeinit(GSNetState* state) {
if(state->buffer.data != NULL) free(state->buffer.data); 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);
}