wip
This commit is contained in:
parent
5c653ffd6a
commit
3ce889edf5
9 changed files with 84 additions and 17 deletions
|
|
@ -10,13 +10,17 @@ extern "C" {
|
||||||
|
|
||||||
#define GSNetDefaultPort 23903
|
#define GSNetDefaultPort 23903
|
||||||
|
|
||||||
|
#define GSNetPacketFlagAcknowledge (1 << 0)
|
||||||
|
|
||||||
/* net_client.c */
|
/* net_client.c */
|
||||||
GSDECL GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port);
|
GSDECL GSNetClient GSNetClientOpen(GSClient net, const char* hostname, int port);
|
||||||
GSDECL void GSNetClientClose(GSNetClient client);
|
GSDECL void GSNetClientStep(GSNetClient net);
|
||||||
|
GSDECL void GSNetClientClose(GSNetClient net);
|
||||||
|
|
||||||
/* net_server.c */
|
/* net_server.c */
|
||||||
GSDECL GSNetServer GSNetServerOpen(GSServer server, int port);
|
GSDECL GSNetServer GSNetServerOpen(GSServer net, int port);
|
||||||
GSDECL void GSNetServerClose(GSNetServer server);
|
GSDECL void GSNetServerStep(GSNetServer net);
|
||||||
|
GSDECL void GSNetServerClose(GSNetServer net);
|
||||||
|
|
||||||
/* net_base.c */
|
/* net_base.c */
|
||||||
GSDECL GSBool GSNetBaseHasData(int fd);
|
GSDECL GSBool GSNetBaseHasData(int fd);
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,7 @@ typedef struct _GSBox GSBox;
|
||||||
typedef struct _GSNetPacketHeader GSNetPacketHeader;
|
typedef struct _GSNetPacketHeader GSNetPacketHeader;
|
||||||
typedef struct _GSNetPacket GSNetPacket;
|
typedef struct _GSNetPacket GSNetPacket;
|
||||||
typedef struct _GSNetAddress GSNetAddress;
|
typedef struct _GSNetAddress GSNetAddress;
|
||||||
|
typedef struct _GSBinary GSBinary;
|
||||||
#ifdef _GEARSRC
|
#ifdef _GEARSRC
|
||||||
typedef struct _GSClient* GSClient;
|
typedef struct _GSClient* GSClient;
|
||||||
typedef struct _GSServer* GSServer;
|
typedef struct _GSServer* GSServer;
|
||||||
|
|
@ -116,7 +117,7 @@ struct _GSResourceKV {
|
||||||
struct _GSNetPacketHeader {
|
struct _GSNetPacketHeader {
|
||||||
GSU8 flag;
|
GSU8 flag;
|
||||||
GSU32 index;
|
GSU32 index;
|
||||||
GSU32 sequence;
|
GSU32 seq;
|
||||||
};
|
};
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
@ -132,6 +133,11 @@ struct _GSNetAddress {
|
||||||
GSU16 port;
|
GSU16 port;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct _GSBinary {
|
||||||
|
void* data;
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
#ifdef _GEARSRC
|
#ifdef _GEARSRC
|
||||||
#include <GearSrc/GL/GL.h>
|
#include <GearSrc/GL/GL.h>
|
||||||
#include <miniaudio.h>
|
#include <miniaudio.h>
|
||||||
|
|
@ -248,6 +254,19 @@ struct _GSNetClient {
|
||||||
GSEngine engine;
|
GSEngine engine;
|
||||||
|
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
unsigned int rxseq;
|
||||||
|
unsigned int rxindex;
|
||||||
|
unsigned int rxtotal;
|
||||||
|
unsigned int rxstate;
|
||||||
|
|
||||||
|
unsigned int txseq;
|
||||||
|
unsigned int txindex;
|
||||||
|
unsigned int txtotal;
|
||||||
|
unsigned int txstate;
|
||||||
|
|
||||||
|
GSBinary* rx;
|
||||||
|
GSBinary* tx;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GSNetServer {
|
struct _GSNetServer {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <GearSrc/Model.h>
|
#include <GearSrc/Model.h>
|
||||||
#include <GearSrc/Version.h>
|
#include <GearSrc/Version.h>
|
||||||
#include <GearSrc/SoundEngine.h>
|
#include <GearSrc/SoundEngine.h>
|
||||||
|
#include <GearSrc/Net.h>
|
||||||
|
|
||||||
#include <stb_ds.h>
|
#include <stb_ds.h>
|
||||||
|
|
||||||
|
|
@ -118,6 +119,8 @@ void GSClientStep(GSClient client) {
|
||||||
GSVector2 sq[4];
|
GSVector2 sq[4];
|
||||||
int i, j, k, c, t;
|
int i, j, k, c, t;
|
||||||
|
|
||||||
|
if(client->net != NULL) GSNetClientStep(client->net);
|
||||||
|
|
||||||
GSGLClear(client->gl);
|
GSGLClear(client->gl);
|
||||||
GSGLCameraSetup(client->gl);
|
GSGLCameraSetup(client->gl);
|
||||||
GSGLSetLight(client->gl);
|
GSGLSetLight(client->gl);
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,8 @@ GSEngine GSEngineCreate(GSEngineParam* param) {
|
||||||
if(param->client) engine->shutdown++;
|
if(param->client) engine->shutdown++;
|
||||||
if(param->server) engine->shutdown++;
|
if(param->server) engine->shutdown++;
|
||||||
|
|
||||||
|
engine->client->net = GSNetClientOpen(engine->client, "localhost", GSNetDefaultPort);
|
||||||
|
|
||||||
return engine;
|
return engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,16 @@ static int new_socket(void) {
|
||||||
|
|
||||||
GSBool GSNetBaseHasData(int fd) {
|
GSBool GSNetBaseHasData(int fd) {
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
|
struct timeval tv;
|
||||||
|
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
|
|
||||||
FD_SET(fd, &fds);
|
FD_SET(fd, &fds);
|
||||||
|
|
||||||
select(FD_SETSIZE, &fds, NULL, NULL, NULL);
|
select(FD_SETSIZE, &fds, NULL, NULL, &tv);
|
||||||
|
|
||||||
if(FD_ISSET(fd, &fds)) return GSTrue;
|
if(FD_ISSET(fd, &fds)) return GSTrue;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,39 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
|
||||||
return net;
|
return net;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetClientClose(GSNetClient client) {
|
enum states {
|
||||||
if(client->fd >= 0) GSNetBaseClose(client->fd);
|
Acknowledged = 0,
|
||||||
|
WaitingAcknowledge
|
||||||
|
};
|
||||||
|
|
||||||
free(client);
|
void GSNetClientStep(GSNetClient net) {
|
||||||
|
GSNetPacket pkt;
|
||||||
|
GSNetAddress addr;
|
||||||
|
|
||||||
|
while(GSNetBaseHasData(net->fd)) {
|
||||||
|
GSNetPacketRead(net->fd, &pkt, &addr);
|
||||||
|
|
||||||
|
if(pkt.header.flag & GSNetPacketFlagAcknowledge) {
|
||||||
|
if(net->txstate == WaitingAcknowledge && net->txindex == pkt.header.index && net->txseq == pkt.header.seq) {
|
||||||
|
GSLog(net->engine, GSLogDebug, "ACK received for %d:%d", net->txindex, net->txseq);
|
||||||
|
|
||||||
|
if(net->txseq == net->txtotal) net->txstate = Acknowledged;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(net->rxstate == Acknowledged && net->rxindex == pkt.header.index && net->rxseq == pkt.header.seq) {
|
||||||
|
pkt.header.flag |= GSNetPacketFlagAcknowledge;
|
||||||
|
pkt.header.index = net->rxindex;
|
||||||
|
pkt.header.seq = net->rxseq;
|
||||||
|
pkt.size = 0;
|
||||||
|
|
||||||
|
GSNetPacketWrite(net->fd, &pkt, &addr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void GSNetClientClose(GSNetClient net) {
|
||||||
|
if(net->fd >= 0) GSNetBaseClose(net->fd);
|
||||||
|
|
||||||
|
free(net);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address) {
|
||||||
memcpy(packet->data, buf + sizeof(packet->header), packet->size);
|
memcpy(packet->data, buf + sizeof(packet->header), packet->size);
|
||||||
|
|
||||||
packet->header.index = GSEndianSwapU32BE(packet->header.index);
|
packet->header.index = GSEndianSwapU32BE(packet->header.index);
|
||||||
packet->header.sequence = GSEndianSwapU32BE(packet->header.sequence);
|
packet->header.seq = GSEndianSwapU32BE(packet->header.seq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address) {
|
void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address) {
|
||||||
|
|
@ -19,7 +19,7 @@ void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address) {
|
||||||
unsigned char buf[508];
|
unsigned char buf[508];
|
||||||
|
|
||||||
header.index = GSEndianSwapU32BE(header.index);
|
header.index = GSEndianSwapU32BE(header.index);
|
||||||
header.sequence = GSEndianSwapU32BE(header.sequence);
|
header.seq = GSEndianSwapU32BE(header.seq);
|
||||||
|
|
||||||
memcpy(buf, &header, sizeof(header));
|
memcpy(buf, &header, sizeof(header));
|
||||||
memcpy(buf + sizeof(header), packet->data, packet->size);
|
memcpy(buf + sizeof(header), packet->data, packet->size);
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,11 @@ GSNetServer GSNetServerOpen(GSServer server, int port) {
|
||||||
return net;
|
return net;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSNetServerClose(GSNetServer server) {
|
void GSNetServerStep(GSNetServer net) {
|
||||||
if(server->fd >= 0) GSNetBaseClose(server->fd);
|
}
|
||||||
|
|
||||||
free(server);
|
void GSNetServerClose(GSNetServer net) {
|
||||||
|
if(net->fd >= 0) GSNetBaseClose(net->fd);
|
||||||
|
|
||||||
|
free(net);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -31,4 +31,5 @@ void GSServerDestroy(GSServer server) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSServerStep(GSServer server) {
|
void GSServerStep(GSServer server) {
|
||||||
|
GSNetServerStep(server->net);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue