feat(server): added socket creation and address binding for server
This commit is contained in:
parent
001eaf17e4
commit
4afa1de4b3
4 changed files with 84 additions and 1 deletions
|
|
@ -29,6 +29,8 @@ typedef enum {
|
||||||
QNET_NETWORK_ERROR_INVALID_IP = -1
|
QNET_NETWORK_ERROR_INVALID_IP = -1
|
||||||
} QNetNetworkError;
|
} 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_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);
|
QNetNetworkError qnet_ip6_address(const char *ip, unsigned short port, struct sockaddr_in6 *address);
|
||||||
|
|
||||||
|
|
|
||||||
24
include/qnet/server.h
Normal file
24
include/qnet/server.h
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) Tristan Franssen, <tristanfranssen@strawhats.nl>.
|
||||||
|
*
|
||||||
|
* 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
|
||||||
|
|
@ -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) {
|
QNetNetworkError qnet_ip6_address(const char *ip, unsigned short port, struct sockaddr_in6 *address) {
|
||||||
address->sin6_family = AF_INET6;
|
address->sin6_family = AF_INET6;
|
||||||
address->sin6_port = htons(port);
|
address->sin6_port = htons(port);
|
||||||
|
|
||||||
int result = inet_pton(address->sin6_family, ip, &address->sin6_addr.s6_addr);
|
int result = inet_pton(address->sin6_family, ip, &address->sin6_addr.s6_addr);
|
||||||
if (result != 1) {
|
if (result != 1) {
|
||||||
return QNET_NETWORK_ERROR_INVALID_IP;
|
return QNET_NETWORK_ERROR_INVALID_IP;
|
||||||
|
|
|
||||||
57
src/server.c
Normal file
57
src/server.c
Normal file
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) Tristan Franssen, <tristanfranssen@strawhats.nl>.
|
||||||
|
*
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue