wip netcode
This commit is contained in:
parent
c9a9ce841b
commit
f65a3179ac
8 changed files with 191 additions and 8 deletions
110
engine/src/net/net_base.c
Normal file
110
engine/src/net/net_base.c
Normal 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));
|
||||
}
|
||||
1
engine/src/net/net_client.c
Normal file
1
engine/src/net/net_client.c
Normal file
|
|
@ -0,0 +1 @@
|
|||
#include <GearSrc/Net.h>
|
||||
9
engine/src/net/net_packet.c
Normal file
9
engine/src/net/net_packet.c
Normal 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) {
|
||||
}
|
||||
1
engine/src/net/net_server.c
Normal file
1
engine/src/net/net_server.c
Normal file
|
|
@ -0,0 +1 @@
|
|||
#include <GearSrc/Net.h>
|
||||
Loading…
Add table
Add a link
Reference in a new issue