oops
This commit is contained in:
parent
abce75957e
commit
cde6519059
1 changed files with 92 additions and 0 deletions
92
engine/src/net/net_state.c
Normal file
92
engine/src/net/net_state.c
Normal file
|
|
@ -0,0 +1,92 @@
|
|||
#include <GearSrc/Net.h>
|
||||
|
||||
#include <GearSrc/Endian.h>
|
||||
#include <GearSrc/Log.h>
|
||||
|
||||
#include <stb_ds.h>
|
||||
|
||||
enum states {
|
||||
Acknowledged = 0,
|
||||
WaitingAcknowledge
|
||||
};
|
||||
|
||||
void GSNetStateRead(GSNetState* state, int fd, 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);
|
||||
|
||||
state->txstate = Acknowledged;
|
||||
state->txseq++;
|
||||
if(state->txseq == (state->txtotal + 1)){
|
||||
state->txseq = 0;
|
||||
state->txindex++;
|
||||
|
||||
arrdel(state->tx, 0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
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);
|
||||
}
|
||||
|
||||
GSNetPacketWrite(fd, &pkt, address);
|
||||
|
||||
state->rxseq++;
|
||||
if(state->rxseq == (state->rxtotal + 1)){
|
||||
state->rxseq = 0;
|
||||
state->rxindex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
|
||||
|
||||
if(arrlen(state->tx) > 0){
|
||||
if(state->txstate == Acknowledged){
|
||||
int n = state->tx[0].size;
|
||||
GSNetPacket pkt;
|
||||
|
||||
if(state->txseq == 0){
|
||||
GSU32 t;
|
||||
|
||||
state->txtotal = 0;
|
||||
|
||||
while(n > 0){
|
||||
n -= 508 - sizeof(pkt.header);
|
||||
state->txtotal++;
|
||||
}
|
||||
|
||||
t = GSEndianSwapU32BE(state->txtotal);
|
||||
|
||||
pkt.header.flag = 0;
|
||||
pkt.header.index = state->txindex;
|
||||
pkt.header.seq = state->txseq;
|
||||
memcpy(pkt.data, &t, 4);
|
||||
pkt.size = 4;
|
||||
}
|
||||
|
||||
GSNetPacketWrite(fd, &pkt, address);
|
||||
|
||||
state->txstate = WaitingAcknowledge;
|
||||
if(state->engine->param->get_tick != NULL) state->txtick = state->engine->param->get_tick();
|
||||
|
||||
GSLog(state->engine, GSLogDebug, "Sent packet %d:%d", state->txindex, state->txseq);
|
||||
}else if(state->engine->param->get_tick == NULL){
|
||||
}else if((state->engine->param->get_tick() - state->txtick) >= 500){
|
||||
GSLog(state->engine, GSLogDebug, "Lost packet %d:%d", state->txindex, state->txseq);
|
||||
|
||||
state->txstate = Acknowledged;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue