mmm
This commit is contained in:
parent
829e6a9b76
commit
abce75957e
3 changed files with 30 additions and 81 deletions
|
|
@ -34,6 +34,10 @@ GSDECL void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address
|
||||||
GSDECL void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address);
|
GSDECL void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address);
|
||||||
GSDECL void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address);
|
GSDECL void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address);
|
||||||
|
|
||||||
|
/* net_state.c */
|
||||||
|
GSDECL void GSNetStateRead(GSNetState* state, int fd, GSNetPacket* packet, GSNetAddress* address);
|
||||||
|
GSDECL void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,7 @@ typedef struct _GSNetPacketHeader GSNetPacketHeader;
|
||||||
typedef struct _GSNetPacket GSNetPacket;
|
typedef struct _GSNetPacket GSNetPacket;
|
||||||
typedef struct _GSNetAddress GSNetAddress;
|
typedef struct _GSNetAddress GSNetAddress;
|
||||||
typedef struct _GSBinary GSBinary;
|
typedef struct _GSBinary GSBinary;
|
||||||
|
typedef struct _GSNetState GSNetState;
|
||||||
#ifdef _GEARSRC
|
#ifdef _GEARSRC
|
||||||
typedef struct _GSClient* GSClient;
|
typedef struct _GSClient* GSClient;
|
||||||
typedef struct _GSServer* GSServer;
|
typedef struct _GSServer* GSServer;
|
||||||
|
|
@ -138,6 +139,23 @@ struct _GSBinary {
|
||||||
int size;
|
int size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _GSNetState {
|
||||||
|
GSEngine engine;
|
||||||
|
|
||||||
|
unsigned int rxseq;
|
||||||
|
unsigned int rxindex;
|
||||||
|
unsigned int rxtotal;
|
||||||
|
|
||||||
|
unsigned int txseq;
|
||||||
|
unsigned int txindex;
|
||||||
|
unsigned int txtotal;
|
||||||
|
unsigned int txstate;
|
||||||
|
unsigned long txtick;
|
||||||
|
|
||||||
|
GSBinary* rx;
|
||||||
|
GSBinary* tx;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef _GEARSRC
|
#ifdef _GEARSRC
|
||||||
#include <GearSrc/GL/GL.h>
|
#include <GearSrc/GL/GL.h>
|
||||||
#include <miniaudio.h>
|
#include <miniaudio.h>
|
||||||
|
|
@ -255,18 +273,7 @@ struct _GSNetClient {
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
unsigned int rxseq;
|
GSNetState state;
|
||||||
unsigned int rxindex;
|
|
||||||
unsigned int rxtotal;
|
|
||||||
|
|
||||||
unsigned int txseq;
|
|
||||||
unsigned int txindex;
|
|
||||||
unsigned int txtotal;
|
|
||||||
unsigned int txstate;
|
|
||||||
unsigned long txtick;
|
|
||||||
|
|
||||||
GSBinary* rx;
|
|
||||||
GSBinary* tx;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GSNetServer {
|
struct _GSNetServer {
|
||||||
|
|
|
||||||
|
|
@ -19,88 +19,26 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
net->state.engine = net->engine;
|
||||||
|
|
||||||
GSBinary b;
|
GSBinary b;
|
||||||
b.data = strdup("Hello");
|
b.data = strdup("Hello");
|
||||||
b.size = 5;
|
b.size = 5;
|
||||||
arrput(net->tx, b);
|
arrput(net->state.tx, b);
|
||||||
|
|
||||||
return net;
|
return net;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum states {
|
|
||||||
Acknowledged = 0,
|
|
||||||
WaitingAcknowledge
|
|
||||||
};
|
|
||||||
|
|
||||||
void GSNetClientStep(GSNetClient net) {
|
void GSNetClientStep(GSNetClient net) {
|
||||||
GSNetPacket pkt;
|
GSNetPacket pkt;
|
||||||
GSNetAddress addr;
|
GSNetAddress addr;
|
||||||
|
|
||||||
while(GSNetBaseHasData(net->fd)){
|
while(GSNetBaseHasData(net->fd)){
|
||||||
GSNetPacketRead(net->fd, &pkt, &addr);
|
GSNetPacketRead(net->fd, &pkt, &addr);
|
||||||
|
GSNetStateRead(&net->state, net->fd, &pkt, &addr);
|
||||||
if(pkt.header.flag & GSNetPacketFlagAcknowledge) {
|
|
||||||
if(arrlen(net->tx) > 0 && net->txstate == WaitingAcknowledge && net->txindex == pkt.header.index && net->txseq == pkt.header.seq) {
|
|
||||||
GSLog(net->engine, GSLogDebug, "Received ACK packet %d:%d", net->txindex, net->txseq);
|
|
||||||
|
|
||||||
net->txstate = Acknowledged;
|
|
||||||
net->txseq++;
|
|
||||||
if(net->txseq == (net->txtotal + 1)){
|
|
||||||
net->txseq = 0;
|
|
||||||
net->txindex++;
|
|
||||||
|
|
||||||
arrdel(net->tx, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(net->rxindex == pkt.header.index && net->rxseq == pkt.header.seq) {
|
|
||||||
GSLog(net->engine, GSLogDebug, "Received packet %d:%d", net->rxindex, net->rxseq);
|
|
||||||
|
|
||||||
pkt.header.flag |= GSNetPacketFlagAcknowledge;
|
|
||||||
pkt.header.index = net->rxindex;
|
|
||||||
pkt.header.seq = net->rxseq;
|
|
||||||
pkt.size = 0;
|
|
||||||
|
|
||||||
if(net->rxseq == 0){
|
|
||||||
net->rxtotal = GSEndianSwapU32BE(*(GSU32*)pkt.data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
GSNetPacketWrite(net->fd, &pkt, &addr);
|
GSNetStateWrite(&net->state, net->fd, &addr);
|
||||||
|
|
||||||
net->rxseq++;
|
|
||||||
if(net->rxseq == (net->rxtotal + 1)){
|
|
||||||
net->rxseq = 0;
|
|
||||||
net->rxindex++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(arrlen(net->tx) > 0){
|
|
||||||
if(net->txstate == Acknowledged){
|
|
||||||
int n = net->tx[0].size;
|
|
||||||
|
|
||||||
if(net->txseq == 0){
|
|
||||||
net->txtotal = 0;
|
|
||||||
|
|
||||||
while(n > 0){
|
|
||||||
n -= 508 - sizeof(pkt.header);
|
|
||||||
net->txtotal++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
net->txstate = WaitingAcknowledge;
|
|
||||||
if(net->engine->param->get_tick != NULL) net->txtick = net->engine->param->get_tick();
|
|
||||||
|
|
||||||
GSLog(net->engine, GSLogDebug, "Sent packet %d:%d", net->txindex, net->txseq);
|
|
||||||
}else if(net->engine->param->get_tick == NULL){
|
|
||||||
}else if((net->engine->param->get_tick() - net->txtick) >= 500){
|
|
||||||
GSLog(net->engine, GSLogDebug, "Lost pcaket %d:%d", net->txindex, net->txseq);
|
|
||||||
|
|
||||||
net->txstate = Acknowledged;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetClientClose(GSNetClient net) {
|
void GSNetClientClose(GSNetClient net) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue