implement unsafe packet and etc
This commit is contained in:
parent
5f78f5acd8
commit
7993a64720
4 changed files with 67 additions and 25 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue