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 */
|
/* net_state.c */
|
||||||
GSDECL void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
|
GSDECL void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address);
|
||||||
GSDECL void GSNetStateWrite(GSNetState* state, GSNetSocket sock, 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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -162,6 +162,8 @@ struct _GSNetState {
|
||||||
GSBinary* rx;
|
GSBinary* rx;
|
||||||
GSBinary* tx;
|
GSBinary* tx;
|
||||||
|
|
||||||
|
GSBinary buffer;
|
||||||
|
|
||||||
void* opaque;
|
void* opaque;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GSNetStateInit(&net->state, client->engine);
|
||||||
strcpy(net->state.name, "Client");
|
strcpy(net->state.name, "Client");
|
||||||
net->state.engine = net->engine;
|
|
||||||
|
|
||||||
return net;
|
return net;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ void GSNetServerStep(GSNetServer net) {
|
||||||
GSNetState v;
|
GSNetState v;
|
||||||
|
|
||||||
memset(&v, 0, sizeof(v));
|
memset(&v, 0, sizeof(v));
|
||||||
v.engine = net->engine;
|
GSNetStateInit(&v, net->engine);
|
||||||
strcpy(v.name, "Server");
|
strcpy(v.name, "Server");
|
||||||
|
|
||||||
hmput(net->client, addr, v);
|
hmput(net->client, addr, v);
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
||||||
state->txseq = 0;
|
state->txseq = 0;
|
||||||
state->txindex++;
|
state->txindex++;
|
||||||
|
|
||||||
|
free(state->tx[0].data);
|
||||||
arrdel(state->tx, 0);
|
arrdel(state->tx, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -40,12 +41,21 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
||||||
|
|
||||||
if(state->rxseq == 0) {
|
if(state->rxseq == 0) {
|
||||||
state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data);
|
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++;
|
state->rxseq++;
|
||||||
if(state->rxseq == (state->rxtotal + 1)) {
|
if(state->rxseq == (state->rxtotal + 1)) {
|
||||||
|
arrput(state->rx, state->buffer);
|
||||||
|
|
||||||
|
state->buffer.data = NULL;
|
||||||
|
|
||||||
state->rxseq = 0;
|
state->rxseq = 0;
|
||||||
state->rxindex++;
|
state->rxindex++;
|
||||||
}
|
}
|
||||||
|
|
@ -79,6 +89,7 @@ void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address)
|
||||||
|
|
||||||
GSNetPacketWrite(sock, &pkt, address);
|
GSNetPacketWrite(sock, &pkt, address);
|
||||||
|
|
||||||
|
free(state->tx[i].data);
|
||||||
arrdel(state->tx, i);
|
arrdel(state->tx, i);
|
||||||
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