From 4afa1de4b388786d6a0acd5e045b2ecb2410fcc1 Mon Sep 17 00:00:00 2001 From: Mineplay Date: Fri, 23 Jan 2026 23:42:27 +0100 Subject: [PATCH] feat(server): added socket creation and address binding for server --- include/qnet/network.h | 2 ++ include/qnet/server.h | 24 ++++++++++++++++++ src/network.c | 2 +- src/server.c | 57 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 include/qnet/server.h create mode 100644 src/server.c diff --git a/include/qnet/network.h b/include/qnet/network.h index e807c49..987b4c6 100644 --- a/include/qnet/network.h +++ b/include/qnet/network.h @@ -29,6 +29,8 @@ typedef enum { QNET_NETWORK_ERROR_INVALID_IP = -1 } QNetNetworkError; +inline void qnet_socket_init(qnet_socket_type *socket) { *socket = 0; } + QNetNetworkError qnet_ip4_address(const char *ip, unsigned short port, struct sockaddr_in *address); QNetNetworkError qnet_ip6_address(const char *ip, unsigned short port, struct sockaddr_in6 *address); diff --git a/include/qnet/server.h b/include/qnet/server.h new file mode 100644 index 0000000..656a25a --- /dev/null +++ b/include/qnet/server.h @@ -0,0 +1,24 @@ +/* + * Copyright (C) Tristan Franssen, . + * + * This software is licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License in the file LICENSE or at + * http://www.apache.org/licenses/LICENSE-2.0 + */ +#ifndef QNET_SERVER +#define QNET_SERVER + +#include "qnet/network.h" + +typedef enum { + QNET_SERVER_ERROR_OK = 0, + QNET_SERVER_ERROR_FAILED_TO_CREATE_SOCKET = -1, + QNET_SERVER_ERROR_INVALID_ADDRESS = -2, + QNET_SERVER_ERROR_FAILED_TO_BIND_ADDRESS = -3 +} QNetServerError; + +QNetServerError qnet_server_tcp_bind(qnet_socket_type *server_socket, struct sockaddr *address); +QNetServerError qnet_server_udp_bind(qnet_socket_type *server_socket, struct sockaddr *address); + +#endif \ No newline at end of file diff --git a/src/network.c b/src/network.c index 4bc13ea..5f48577 100644 --- a/src/network.c +++ b/src/network.c @@ -23,7 +23,7 @@ QNetNetworkError qnet_ip4_address(const char *ip, unsigned short port, struct so QNetNetworkError qnet_ip6_address(const char *ip, unsigned short port, struct sockaddr_in6 *address) { address->sin6_family = AF_INET6; address->sin6_port = htons(port); - + int result = inet_pton(address->sin6_family, ip, &address->sin6_addr.s6_addr); if (result != 1) { return QNET_NETWORK_ERROR_INVALID_IP; diff --git a/src/server.c b/src/server.c new file mode 100644 index 0000000..aa21836 --- /dev/null +++ b/src/server.c @@ -0,0 +1,57 @@ +/* + * Copyright (C) Tristan Franssen, . + * + * This software is licensed under the Apache License, Version 2.0 (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License in the file LICENSE or at + * http://www.apache.org/licenses/LICENSE-2.0 + */ +#include "qnet/server.h" + +QNetServerError qnet_tcp_bind(qnet_socket_type *server_socket, struct sockaddr *address) { + qnet_socket_type tcp_socket = socket(address->sa_family, SOCK_STREAM, 0); + if (tcp_socket == QNET_INVALID_SOCKET) { + return QNET_SERVER_ERROR_FAILED_TO_CREATE_SOCKET; + } + + unsigned int address_length; + if (address->sa_family == AF_INET) { + address_length = sizeof(struct sockaddr_in); + } else if (address->sa_family == AF_INET6) { + address_length = sizeof(struct sockaddr_in6); + } else { + return QNET_SERVER_ERROR_INVALID_ADDRESS; + } + + int result = bind(tcp_socket, address, address_length); + if (result == -1) { + return QNET_SERVER_ERROR_FAILED_TO_BIND_ADDRESS; + } + + *server_socket = tcp_socket; + return QNET_SERVER_ERROR_OK; +} + +QNetServerError qnet_udp_bind(qnet_socket_type *server_socket, struct sockaddr *address) { + qnet_socket_type udp_socket = socket(address->sa_family, SOCK_DGRAM, 0); + if (udp_socket == QNET_INVALID_SOCKET) { + return QNET_SERVER_ERROR_FAILED_TO_CREATE_SOCKET; + } + + unsigned int address_length; + if (address->sa_family == AF_INET) { + address_length = sizeof(struct sockaddr_in); + } else if (address->sa_family == AF_INET6) { + address_length = sizeof(struct sockaddr_in6); + } else { + return QNET_SERVER_ERROR_INVALID_ADDRESS; + } + + int result = bind(udp_socket, address, address_length); + if (result == -1) { + return QNET_SERVER_ERROR_FAILED_TO_BIND_ADDRESS; + } + + *server_socket = udp_socket; + return QNET_SERVER_ERROR_OK; +} \ No newline at end of file