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

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>