wip netcode

This commit is contained in:
Nishi 2026-01-29 15:01:53 +09:00
commit f65a3179ac
Signed by: nishi
GPG key ID: 27EF69B208EB9343
8 changed files with 191 additions and 8 deletions

View file

@ -22,7 +22,7 @@ include_directories(external/jar)
include_directories(external/miniaudio)
include_directories(external/dr_libs)
file(GLOB GearSrc_SRC src/*.c src/gl/*.c src/sound/*.c src/external/*.c)
file(GLOB GearSrc_SRC src/*.c src/gl/*.c src/sound/*.c src/net/*.c src/external/*.c)
add_library(GearSrc SHARED ${GearSrc_SRC})
target_include_directories(GearSrc PUBLIC include)

View file

@ -6,6 +6,9 @@
#include <string.h>
#include <stdarg.h>
#include <math.h>
#ifndef _WIN32
#include <unistd.h>
#endif
#if defined(_GEARSRC) && defined(_WIN32)
#define GSDECL extern __declspec(dllexport)

View file

@ -0,0 +1,35 @@
#ifndef __GEARSRC_NET_H__
#define __GEARSRC_NET_H__
#include <GearSrc/MachDep.h>
#include <GearSrc/TypeDefs.h>
#ifdef __cplusplus
extern "C" {
#endif
/* net_client.c */
GSDECL GSNetClient GSNetClientOpen(GSClient client, const char* hostname, int port);
GSDECL void GSNetClientClose(GSNetClient client);
/* net_server.c */
GSDECL GSNetServer GSNetServerOpen(GSServer server, int port);
GSDECL void GSNetServerClose(GSNetServer server);
/* net_base.c */
GSDECL GSBool GSNetBaseHasData(int fd);
GSDECL int GSNetBaseServer(int port);
GSDECL int GSNetBaseClient(const char* hostname, int port);
GSDECL void GSNetBaseClose(int fd);
GSDECL void GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address); /* always read 508 bytes! */
GSDECL void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address);
/* net_packet.c */
GSDECL void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address);
GSDECL void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address);
#ifdef __cplusplus
}
#endif
#endif

View file

@ -41,11 +41,13 @@ typedef GSU8 GSBool;
#define GSTrue ((GSBool)1)
#define GSFalse ((GSBool)0)
typedef struct _GSVersion GSVersion;
typedef struct _GSEngineParam GSEngineParam;
typedef struct _GSResourceKV GSResourceKV;
typedef struct _GSBox GSBox;
typedef struct _GSNetPacket GSNetPacket;
typedef struct _GSVersion GSVersion;
typedef struct _GSEngineParam GSEngineParam;
typedef struct _GSResourceKV GSResourceKV;
typedef struct _GSBox GSBox;
typedef struct _GSNetPacketHeader GSNetPacketHeader;
typedef struct _GSNetPacket GSNetPacket;
typedef struct _GSNetAddress GSNetAddress;
#ifdef _GEARSRC
typedef struct _GSClient* GSClient;
typedef struct _GSServer* GSServer;
@ -58,6 +60,8 @@ typedef struct _GSModel* GSModel;
typedef struct _GSSoundDriver* GSSoundDriver;
typedef struct _GSSoundEngine* GSSoundEngine;
typedef struct _GSSound* GSSound;
typedef struct _GSNetClient* GSNetClient;
typedef struct _GSNetServer* GSNetServer;
typedef struct _GSModelFace GSModelFace;
typedef struct _GSModelMaterial GSModelMaterial;
@ -107,13 +111,25 @@ struct _GSResourceKV {
};
#pragma pack(1)
struct _GSNetPacket {
GSU8 flag;
struct _GSNetPacketHeader {
GSU8 flag;
GSU32 index;
GSU32 sequence;
};
#pragma pack()
struct _GSNetPacket {
GSNetPacketHeader header;
unsigned char data[508];
int size;
};
/* i hope someone adds ipv6 support :) */
struct _GSNetAddress {
GSU32 address;
GSU16 port;
};
#ifdef _GEARSRC
#include <GearSrc/GL/GL.h>
#include <miniaudio.h>
@ -226,6 +242,14 @@ struct _GSSoundEngine {
GSSound* sound;
};
struct _GSNetClient {
GSEngine engine;
};
struct _GSNetServer {
GSEngine engine;
};
struct _GSClient {
GSEngine engine;

110
engine/src/net/net_base.c Normal file
View file

@ -0,0 +1,110 @@
#include <GearSrc/Net.h>
#ifdef _WIN32
/* TODO: check if this works */
#include <winsock.h>
#else
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/select.h>
#include <netdb.h>
#endif
static int new_socket(void) {
int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
#ifdef _WIN32
if(fd == INVALID_SOCKET) return -1;
#else
if(fd < 0) return -1;
#endif
return fd;
}
GSBool GSNetBaseHasData(int fd) {
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
select(FD_SETSIZE, &fds, NULL, NULL, NULL);
if(FD_ISSET(fd, &fds)) return GSTrue;
return GSFalse;
}
int GSNetBaseServer(int port) {
int fd;
struct sockaddr_in addr;
int yes = 1;
if((fd = new_socket()) < 0) return -1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char*)&yes, sizeof(yes));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(port);
if(bind(fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
GSNetBaseClose(fd);
return -1;
}
return fd;
}
int GSNetBaseClient(const char* hostname, int port) {
struct sockaddr_in addr;
int fd;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(hostname);
addr.sin_port = htons(port);
if(addr.sin_addr.s_addr == 0xffffffff) {
struct hostent* host = gethostbyname(hostname);
if(host == NULL) return -1;
addr.sin_addr.s_addr = *(GSU32*)host->h_addr_list[0];
}
if((fd = new_socket()) < 0) return -1;
connect(fd, (struct sockaddr*)&addr, sizeof(addr));
return fd;
}
void GSNetBaseClose(int fd) {
#ifdef _WIN32
closesocket(fd);
#else
close(fd);
#endif
}
void GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address) {
struct sockaddr_in addr;
int len = sizeof(addr);
recvfrom(fd, data, size, 0, (struct sockaddr*)&addr, &len);
address->address = addr.sin_addr.s_addr;
address->port = addr.sin_port;
}
void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address) {
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = address->address;
addr.sin_port = address->port;
sendto(fd, data, size, 0, (struct sockaddr*)&addr, sizeof(addr));
}

View file

@ -0,0 +1 @@
#include <GearSrc/Net.h>

View file

@ -0,0 +1,9 @@
#include <GearSrc/Net.h>
#include <GearSrc/Endian.h>
void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address) {
}
void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address) {
}

View file

@ -0,0 +1 @@
#include <GearSrc/Net.h>