functional
This commit is contained in:
parent
71fdf90267
commit
2d27818e26
5 changed files with 40 additions and 4 deletions
|
|
@ -56,6 +56,8 @@ GSDECL void GSNetPacketWrite(GSNetSocket sock, GSNetPacket* packet, GSNetAddress
|
|||
/* 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);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
|||
|
|
@ -162,6 +162,8 @@ struct _GSNetState {
|
|||
GSBinary* rx;
|
||||
GSBinary* tx;
|
||||
|
||||
GSBinary buffer;
|
||||
|
||||
void* opaque;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
|||
return NULL;
|
||||
}
|
||||
|
||||
GSNetStateInit(&net->state, client->engine);
|
||||
strcpy(net->state.name, "Client");
|
||||
net->state.engine = net->engine;
|
||||
|
||||
return net;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ void GSNetServerStep(GSNetServer net) {
|
|||
GSNetState v;
|
||||
|
||||
memset(&v, 0, sizeof(v));
|
||||
v.engine = net->engine;
|
||||
GSNetStateInit(&v, net->engine);
|
||||
strcpy(v.name, "Server");
|
||||
|
||||
hmput(net->client, addr, v);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
|||
state->txseq = 0;
|
||||
state->txindex++;
|
||||
|
||||
free(state->tx[0].data);
|
||||
arrdel(state->tx, 0);
|
||||
}
|
||||
}
|
||||
|
|
@ -40,12 +41,21 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
|||
|
||||
if(state->rxseq == 0) {
|
||||
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++;
|
||||
if(state->rxseq == (state->rxtotal + 1)) {
|
||||
arrput(state->rx, state->buffer);
|
||||
|
||||
state->buffer.data = NULL;
|
||||
|
||||
state->rxseq = 0;
|
||||
state->rxindex++;
|
||||
}
|
||||
|
|
@ -79,6 +89,7 @@ void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address)
|
|||
|
||||
GSNetPacketWrite(sock, &pkt, address);
|
||||
|
||||
free(state->tx[i].data);
|
||||
arrdel(state->tx, 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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue