This commit is contained in:
Nishi 2026-01-29 16:43:44 +09:00
commit 3ce889edf5
Signed by: nishi
GPG key ID: 27EF69B208EB9343
9 changed files with 84 additions and 17 deletions

View file

@ -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);

View file

@ -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 {

View file

@ -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);

View file

@ -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;
} }

View file

@ -25,13 +25,17 @@ 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;

View file

@ -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);
} }

View file

@ -10,16 +10,16 @@ void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address) {
memcpy(&packet->header, buf, sizeof(packet->header)); memcpy(&packet->header, buf, sizeof(packet->header));
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) {
GSNetPacketHeader header = packet->header; GSNetPacketHeader header = packet->header;
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);

View file

@ -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);
} }

View file

@ -31,4 +31,5 @@ void GSServerDestroy(GSServer server) {
} }
void GSServerStep(GSServer server) { void GSServerStep(GSServer server) {
GSNetServerStep(server->net);
} }