This commit is contained in:
Nishi 2026-01-29 18:34:15 +09:00
commit 0e2ca4f931
6 changed files with 55 additions and 11 deletions

View file

@ -25,7 +25,7 @@ GSDECL void GSNetServerClose(GSNetServer net);
/* net_base.c */
GSDECL GSBool GSNetBaseHasData(int fd);
GSDECL int GSNetBaseServer(int port);
GSDECL int GSNetBaseClient(const char* hostname, int port);
GSDECL int GSNetBaseClient(const char* hostname, int port, GSNetAddress* address);
GSDECL void GSNetBaseClose(int fd);
GSDECL int GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address); /* always read 508 bytes! */
GSDECL void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address);

View file

@ -50,6 +50,7 @@ typedef struct _GSNetPacket GSNetPacket;
typedef struct _GSNetAddress GSNetAddress;
typedef struct _GSBinary GSBinary;
typedef struct _GSNetState GSNetState;
typedef struct _GSNetKV GSNetKV;
#ifdef _GEARSRC
typedef struct _GSClient* GSClient;
typedef struct _GSServer* GSServer;
@ -154,6 +155,13 @@ struct _GSNetState {
GSBinary* rx;
GSBinary* tx;
void* opaque;
};
struct _GSNetKV {
GSNetAddress key;
GSNetState value;
};
#ifdef _GEARSRC
@ -273,6 +281,7 @@ struct _GSNetClient {
int fd;
GSNetAddress address;
GSNetState state;
};
@ -280,6 +289,8 @@ struct _GSNetServer {
GSEngine engine;
int fd;
GSNetKV* client;
};
struct _GSClient {

View file

@ -63,7 +63,7 @@ int GSNetBaseServer(int port) {
return fd;
}
int GSNetBaseClient(const char* hostname, int port) {
int GSNetBaseClient(const char* hostname, int port, GSNetAddress* address) {
struct sockaddr_in addr;
int fd;
@ -78,6 +78,11 @@ int GSNetBaseClient(const char* hostname, int port) {
addr.sin_addr.s_addr = *(GSU32*)host->h_addr_list[0];
}
if(address != NULL){
address->address = addr.sin_addr.s_addr;
address->port = addr.sin_port;
}
if((fd = new_socket()) < 0) return -1;
connect(fd, (struct sockaddr*)&addr, sizeof(addr));

View file

@ -12,7 +12,7 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
net->engine = client->engine;
if((net->fd = GSNetBaseClient(hostname, port)) < 0) {
if((net->fd = GSNetBaseClient(hostname, port, &net->address)) < 0) {
GSLog(client->engine, GSLogError, "Failed to initialize socket");
GSNetClientClose(net);
@ -31,14 +31,13 @@ GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port) {
void GSNetClientStep(GSNetClient net) {
GSNetPacket pkt;
GSNetAddress addr;
while(GSNetBaseHasData(net->fd)){
GSNetPacketRead(net->fd, &pkt, &addr);
GSNetStateRead(&net->state, net->fd, &pkt, &addr);
GSNetPacketRead(net->fd, &pkt, &net->address);
GSNetStateRead(&net->state, net->fd, &pkt, &net->address);
}
GSNetStateWrite(&net->state, net->fd, &addr);
GSNetStateWrite(&net->state, net->fd, &net->address);
}
void GSNetClientClose(GSNetClient net) {

View file

@ -2,6 +2,8 @@
#include <GearSrc/Log.h>
#include <stb_ds.h>
GSNetServer GSNetServerOpen(GSServer server, int port) {
GSNetServer net = malloc(sizeof(*net));
@ -20,6 +22,28 @@ GSNetServer GSNetServerOpen(GSServer server, int port) {
}
void GSNetServerStep(GSNetServer net) {
int i;
GSNetPacket pkt;
GSNetAddress addr;
while(GSNetBaseHasData(net->fd)){
GSNetState v;
memset(&v, 0, sizeof(v));
v.engine = net->engine;
GSNetPacketRead(net->fd, &pkt, &addr);
i = hmgeti(net->client, addr);
if(i != -1) v = net->client[i].value;
GSNetStateRead(&v, net->fd, &pkt, &addr);
hmput(net->client, addr, v);
}
for(i = 0; i < hmlen(net->client); i++){
GSNetStateWrite(&net->client[i].value, net->fd, &net->client[i].key);
}
}
void GSNetServerClose(GSNetServer net) {

View file

@ -51,7 +51,6 @@ void GSNetStateRead(GSNetState* state, int fd, GSNetPacket* packet, GSNetAddress
}
void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
if(arrlen(state->tx) > 0){
if(state->txstate == Acknowledged){
int n = state->tx[0].size;
@ -69,12 +68,18 @@ void GSNetStateWrite(GSNetState* state, int fd, GSNetAddress* address){
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;
}else{
int m = 508 - sizeof(pkt.header);
int n = m * (state->txseq - 1);
pkt.size = (n > m) ? m : n;
memcpy(pkt.data, ((unsigned char*)state->tx[0].data) + n, pkt.size);
}
pkt.header.flag = 0;
pkt.header.index = state->txindex;
pkt.header.seq = state->txseq;
GSNetPacketWrite(fd, &pkt, address);