seems to work
This commit is contained in:
parent
0ee72e3446
commit
f08ef9b687
7 changed files with 47 additions and 34 deletions
|
|
@ -120,6 +120,7 @@ int GSNetBaseRead(GSNetSocket sock, void* data, int size, GSNetAddress* address)
|
|||
|
||||
n = recvfrom(sock->fd, data, size, 0, (struct sockaddr*)&addr, &len);
|
||||
|
||||
memset(address, 0, sizeof(*address));
|
||||
address->address = addr.sin_addr.s_addr;
|
||||
address->port = addr.sin_port;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,10 +21,13 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
|||
|
||||
net->state.engine = net->engine;
|
||||
|
||||
GSBinary b;
|
||||
b.data = strdup("Hello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello worldHello world");
|
||||
b.size = strlen(b.data);
|
||||
arrput(net->state.tx, b);
|
||||
int i;
|
||||
for(i = 0; i < 5; i++){
|
||||
GSBinary b;
|
||||
b.data = malloc(512 * 5);
|
||||
b.size = 512 * 5;
|
||||
arrput(net->state.tx, b);
|
||||
}
|
||||
|
||||
return net;
|
||||
}
|
||||
|
|
@ -32,12 +35,14 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
|||
void GSNetClientStep(GSNetClient net) {
|
||||
GSNetPacket pkt;
|
||||
|
||||
while(GSNetBaseHasData(net->sock)) {
|
||||
GSNetPacketRead(net->sock, &pkt, &net->address);
|
||||
GSNetStateRead(&net->state, net->sock, &pkt, &net->address);
|
||||
}
|
||||
do{
|
||||
while(GSNetBaseHasData(net->sock)) {
|
||||
GSNetPacketRead(net->sock, &pkt, &net->address);
|
||||
GSNetStateRead(&net->state, net->sock, &pkt, &net->address);
|
||||
}
|
||||
|
||||
GSNetStateWrite(&net->state, net->sock, &net->address);
|
||||
GSNetStateWrite(&net->state, net->sock, &net->address);
|
||||
}while(GSNetBaseHasData(net->sock));
|
||||
}
|
||||
|
||||
void GSNetClientClose(GSNetClient net) {
|
||||
|
|
|
|||
|
|
@ -26,24 +26,29 @@ void GSNetServerStep(GSNetServer net) {
|
|||
GSNetPacket pkt;
|
||||
GSNetAddress addr;
|
||||
|
||||
while(GSNetBaseHasData(net->sock)) {
|
||||
GSNetState v;
|
||||
do{
|
||||
while(GSNetBaseHasData(net->sock)) {
|
||||
GSNetPacketRead(net->sock, &pkt, &addr);
|
||||
|
||||
memset(&v, 0, sizeof(v));
|
||||
v.engine = net->engine;
|
||||
i = hmgeti(net->client, addr);
|
||||
if(i == -1){
|
||||
GSNetState v;
|
||||
|
||||
GSNetPacketRead(net->sock, &pkt, &addr);
|
||||
memset(&v, 0, sizeof(v));
|
||||
v.engine = net->engine;
|
||||
|
||||
i = hmgeti(net->client, addr);
|
||||
if(i != -1) v = net->client[i].value;
|
||||
hmput(net->client, addr, v);
|
||||
|
||||
GSNetStateRead(&v, net->sock, &pkt, &addr);
|
||||
hmput(net->client, addr, v);
|
||||
}
|
||||
i = hmgeti(net->client, addr);
|
||||
}
|
||||
|
||||
for(i = 0; i < hmlen(net->client); i++) {
|
||||
GSNetStateWrite(&net->client[i].value, net->sock, &net->client[i].key);
|
||||
}
|
||||
GSNetStateRead(&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);
|
||||
}
|
||||
}while(GSNetBaseHasData(net->sock));
|
||||
}
|
||||
|
||||
void GSNetServerClose(GSNetServer net) {
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ enum states {
|
|||
void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address) {
|
||||
if(packet->header.flag & GSNetPacketFlagAcknowledge) {
|
||||
if(arrlen(state->tx) > 0 && state->txstate == WaitingAcknowledge && state->txindex == packet->header.index && state->txseq == packet->header.seq) {
|
||||
GSLog(state->engine, GSLogDebug, "Received ACK packet %d:%d", state->txindex, state->txseq);
|
||||
GSLog(state->engine, GSLogDebug, "Received Acknowledge packet %d:%d", state->txindex, state->txseq);
|
||||
|
||||
state->txstate = Acknowledged;
|
||||
state->txseq++;
|
||||
|
|
@ -25,28 +25,30 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
|||
}
|
||||
}
|
||||
} else {
|
||||
GSNetPacket pkt;
|
||||
if(state->rxindex == packet->header.index && state->rxseq == packet->header.seq) {
|
||||
GSNetPacket pkt;
|
||||
|
||||
GSLog(state->engine, GSLogDebug, "Received packet %d:%d", state->rxindex, state->rxseq);
|
||||
|
||||
pkt.header.flag |= GSNetPacketFlagAcknowledge;
|
||||
pkt.header.index = state->rxindex;
|
||||
pkt.header.seq = state->rxseq;
|
||||
pkt.size = 0;
|
||||
|
||||
if(state->rxseq == 0) {
|
||||
state->rxtotal = GSEndianSwapU32BE(*(GSU32*)pkt.data);
|
||||
state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data);
|
||||
}
|
||||
|
||||
GSNetPacketWrite(sock, &pkt, address);
|
||||
|
||||
state->rxseq++;
|
||||
if(state->rxseq == (state->rxtotal + 1)) {
|
||||
state->rxseq = 0;
|
||||
state->rxindex++;
|
||||
}
|
||||
}
|
||||
|
||||
/* this is to prevent netcode from blowing up when
|
||||
* ACK packet goes missing...
|
||||
*/
|
||||
pkt.header.flag |= GSNetPacketFlagAcknowledge;
|
||||
pkt.header.index = packet->header.index;
|
||||
pkt.header.seq = packet->header.seq;
|
||||
pkt.size = 0;
|
||||
|
||||
GSNetPacketWrite(sock, &pkt, address);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue