From 0e2ca4f931edd581452318383ad4ac140b05fbe1 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Thu, 29 Jan 2026 18:34:15 +0900 Subject: [PATCH] wip --- engine/include/GearSrc/Net.h | 2 +- engine/include/GearSrc/TypeDefs.h | 11 +++++++++++ engine/src/net/net_base.c | 7 ++++++- engine/src/net/net_client.c | 9 ++++----- engine/src/net/net_server.c | 24 ++++++++++++++++++++++++ engine/src/net/net_state.c | 13 +++++++++---- 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/engine/include/GearSrc/Net.h b/engine/include/GearSrc/Net.h index 7eefd06..cb85614 100644 --- a/engine/include/GearSrc/Net.h +++ b/engine/include/GearSrc/Net.h @@ -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); diff --git a/engine/include/GearSrc/TypeDefs.h b/engine/include/GearSrc/TypeDefs.h index 2117f57..dab8f38 100644 --- a/engine/include/GearSrc/TypeDefs.h +++ b/engine/include/GearSrc/TypeDefs.h @@ -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 { diff --git a/engine/src/net/net_base.c b/engine/src/net/net_base.c index 0e25765..13a8961 100644 --- a/engine/src/net/net_base.c +++ b/engine/src/net/net_base.c @@ -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)); diff --git a/engine/src/net/net_client.c b/engine/src/net/net_client.c index e56eda4..3e28f3c 100644 --- a/engine/src/net/net_client.c +++ b/engine/src/net/net_client.c @@ -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) { diff --git a/engine/src/net/net_server.c b/engine/src/net/net_server.c index a32dd12..42e0dc7 100644 --- a/engine/src/net/net_server.c +++ b/engine/src/net/net_server.c @@ -2,6 +2,8 @@ #include +#include + 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) { diff --git a/engine/src/net/net_state.c b/engine/src/net/net_state.c index 23b129f..bec9813 100644 --- a/engine/src/net/net_state.c +++ b/engine/src/net/net_state.c @@ -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);