diff --git a/engine/include/GearSrc/Net.h b/engine/include/GearSrc/Net.h index 7e2dbc1..185e8d6 100644 --- a/engine/include/GearSrc/Net.h +++ b/engine/include/GearSrc/Net.h @@ -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 } diff --git a/engine/src/net/net_client.c b/engine/src/net/net_client.c index d49568a..8c32f40 100644 --- a/engine/src/net/net_client.c +++ b/engine/src/net/net_client.c @@ -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)); } diff --git a/engine/src/net/net_server.c b/engine/src/net/net_server.c index c676037..fa80906 100644 --- a/engine/src/net/net_server.c +++ b/engine/src/net/net_server.c @@ -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)); } diff --git a/engine/src/net/net_state.c b/engine/src/net/net_state.c index b364689..b98a3f4 100644 --- a/engine/src/net/net_state.c +++ b/engine/src/net/net_state.c @@ -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); +}