45#define NETWORK_DISABLE_ZERO_LENGTH_RECV FALSE
47#define NETWORK_IPALL 0
57#define NETWORK_DEPLETE_SOCKET_TIMEOUT 512
59#define NETWORK_DEPLETE_QUEUES_TIMEOUT 1024
61#define NETWORK_CONSECUTIVE_SEND_WAIT 2048
63#define NETWORK_WAIT_CLOSE_TIMEOUT 4096
69#define NETW_SOCKET_ERROR -1
71#define NETW_SOCKET_DISCONNECTED -2
73#define NETW_MAX_RETRIES 8
75#define NETW_RETRY_DELAY 1000
82typedef long long unsigned int SOCKET;
84#define SOCKET_SIZE_FORMAT "%zu"
90#define SOCKET_SIZE_FORMAT "%d"
94#if defined(__linux__) || defined(__sun) || defined(_AIX)
102#include <netinet/in.h>
103#include <netinet/tcp.h>
104#include <arpa/inet.h>
106#include <sys/ioctl.h>
107#include <sys/socket.h>
108#include <sys/select.h>
109#include <semaphore.h>
112#define SOCKET_SIZE_FORMAT "%d"
115#include <linux/sockios.h>
122#define closesocket close
124#define NETFLAGS MSG_NOSIGNAL
126#define INVALID_SOCKET -1
130#elif defined __windows__
132#define SHUT_WR SD_SEND
133#define SHUT_RD SD_RECEIVE
134#define SHUT_RDWR SD_BOTH
137#define ECONNRESET 104
153#define MSG_NOSIGNAL 0
165#define AI_PASSIVE 0x00000001
168#define AI_CANONNAME 0x00000002
170#ifndef AI_NUMERICHOST
171#define AI_NUMERICHOST 0x00000004
173#ifndef AI_NUMERICSERV
174#define AI_NUMERICSERV 0x00000008
177#define AI_ALL 0x00000100
180#define AI_ADDRCONFIG 0x00000400
183#define AI_V4MAPPED 0x00000800
185#ifndef AI_NON_AUTHORITATIVE
186#define AI_NON_AUTHORITATIVE 0x00004000
189#define AI_SECURE 0x00008000
191#ifndef AI_RETURN_PREFERRED_NAMES
192#define AI_RETURN_PREFERRED_NAMES 0x00010000
196#include <semaphore.h>
202#define netw_unload() netw_init_wsa(0, 2, 2)
207#define _OPEN_SYS_SOCK_IPV6 1
208#include <openssl/err.h>
209#include <openssl/ssl.h>
210#include <openssl/crypto.h>
214#define N_ENUM_netw_code_type(_) \
217 _(NETW_RESTART_TIMER, 8) \
218 _(NETW_EMPTY_SENDBUF, 16) \
219 _(NETW_EMPTY_RECVBUF, 32) \
221 _(NETW_EXIT_ASKED, 128) \
222 _(NETW_EXITED, 256) \
224 _(NETW_ENCRYPT_NONE, 1024) \
225 _(NETW_ENCRYPT_OPENSSL, 2048) \
226 _(NETW_THR_ENGINE_STARTED, 4096) \
227 _(NETW_THR_ENGINE_STOPPED, 8192) \
228 _(NETW_DESTROY_RECVBUF, 16384) \
229 _(NETW_DESTROY_SENDBUF, 32768)
363#define netw_atomic_read_state(netw) __atomic_load_n(&(netw)->state, __ATOMIC_ACQUIRE)
368#define netw_atomic_write_state(netw, val) __atomic_store_n(&(netw)->state, (val), __ATOMIC_RELEASE)
393size_t htonst(
size_t value);
395size_t ntohst(
size_t value);
603 const char* target_host,
622 const char* target_host,
639 const char* target_host,
643#define N_URL_MAX_PARAMS 64
674#define N_WS_OP_TEXT 0x01
675#define N_WS_OP_BINARY 0x02
676#define N_WS_OP_CLOSE 0x08
677#define N_WS_OP_PING 0x09
678#define N_WS_OP_PONG 0x0A
NETWORK * netw
Network for server mode, accepting incomming.
static void on_request(N_HTTP_REQUEST *req, N_HTTP_RESPONSE *resp, void *user_data)
Request handler: returns JSON for GET /api/test, 404 otherwise.
#define N_ENUM_DECLARE(MACRO_DEFINITION, enum_name)
Macro to declare a N_ENUM.
structure of a hash table
Structure of a generic LIST container.
A box including a string and his lenght.
volatile int stop_flag
atomic stop flag
char query[2048]
query string (or empty)
struct addrinfo * rhost
getaddrinfo results
int crypto_mode
tell if the socket have to be encrypted (flags NETW_CRYPTO_*)
char * ip
ip of the connected socket
N_SOCKET link
networking socket
char * certificate
openssl certificate file
char netw_errors[8][512]
per-connection error capture ring buffer (max 8 entries, 512 chars each)
int threaded_engine_status
Threaded network engine state for this network.
size_t content_length
Store content length.
char * type
Type of request.
pthread_t send_thr
sending thread
int nb_pending
Nb pending connection,if listening.
int so_reuseaddr
so reuseaddr state
pthread_t recv_thr
receiving thread
int port
port number (0 if not specified)
char * host
proxy hostname
pthread_rwlock_t rwlock
thread safety
NETWORK * netw
underlying network connection
struct sockaddr_storage raddr
connected remote addr
char * path
path starting with "/", or "/" if empty
pthread_mutex_t eventbolt
mutex for threaded access of state event
const SSL_METHOD * method
SSL method container.
N_STR * body
response body
int netw_err_next
next write slot in ring buffer
int deplete_socket_timeout
deplete socket send buffer timeout ( 0 disabled, > 0 wait for timeout and check unset/unack datas)
void * user_data
user data for handler
char * scheme
"http" or "https"
int deplete_queues_timeout
deplete network queues timeout ( 0 disabled, > 0 wait for timeout and check unset/unack datas)
int nb_running_threads
nb running threads, if > 0 thread engine is still running
pthread_mutex_t recvbolt
mutex for threaded access of recv buf
NETWORK * netw
underlying network connection
void(* on_event)(N_SSE_EVENT *event, struct N_SSE_CONN *conn, void *user_data)
callback
pthread_mutex_t sendbolt
mutex for threaded access of send_buf
int send_queue_consecutive_wait
send queue consecutive pool interval, used when there are still items to send, in usec
void(* on_request)(N_HTTP_REQUEST *req, N_HTTP_RESPONSE *resp, void *user_data)
request handler
N_STR * event
event type (or NULL for default)
int connected
1 if handshake completed
N_STR * body
request body (or NULL)
int so_rcvtimeo
send timeout value
char * password
NULL if no auth.
char * query
raw query string without leading '?', or NULL
N_URL_PARAM params[64]
parsed key=value pairs
int tcpnodelay
state of naggle algorythm, 0 untouched, 1 forcibly disabled
char * body
Pointer to the body data.
LIST * headers
list of char* "Name: Value" strings
char * value
parameter value
char * host
remote hostname
int netw_err_count
number of captured errors
SOCKET sock
a normal socket
char path[2048]
request path
char * scheme
"http", "https", or "socks5"
char * port
port of socket
LIST * recv_buf
reveicing buffer (for incomming usage)
int transport_type
transport type: NETWORK_TCP (0) or NETWORK_UDP (1)
int nb_params
number of parsed parameters
int user_id
if part of a user property, id of the user
sem_t send_blocker
block sending func
SSL_CTX * ctx
SSL context holder.
int so_sndbuf
size of the socket send buffer, 0 untouched, else size in bytes
int so_sndtimeo
send timeout value
int retry
retry interval in ms (0 if not set)
char content_type[256]
Store content type.
N_STR * id
last event ID (or NULL)
struct addrinfo hints
address of local machine
int so_keepalive
so keepalive state
netw_func send_data
send func ptr
int addr_infos_loaded
Internal flag to know if we have to free addr infos.
N_STR * payload
message payload
char method[16]
HTTP method.
uint32_t state
state of the connection , NETW_RUN, NETW_QUIT, NETW_STOP , NETW_ERR
LIST * pools
pointers to network pools if members of any
char * username
NULL if no auth.
int status_code
HTTP status code.
char * key
openssl key file
int so_linger
close lingering value (-1 disabled, 0 force close, >0 linger )
unsigned long int is_blocking
flag to quickly check socket mode
int crypto_algo
if encryption is on, which one (flags NETW_ENCRYPT_*)
char content_type[128]
Content-Type header value.
HASH_TABLE * pool
table of clients
NETWORK * listener
listening network
LIST * send_buf
sending buffer (for outgoing queuing )
int mode
NETWORK mode , 1 listening, 0 connecting.
int so_rcvbuf
size of the socket recv buffer, 0 untouched, else size in bytes
void * user_data
user data for callback
netw_func recv_data
receive func ptr
int wait_close_timeout
network wait close timeout value ( < 1 disabled, >= 1 timeout sec )
volatile int stop_flag
atomic stop flag
int netw_send_string_to_all(NETWORK *netw, N_STR *name, N_STR *chan, N_STR *txt, int color)
send string to all targets
#define N_URL_MAX_PARAMS
maximum number of parsed query parameters
N_STR * netw_get_msg(NETWORK *netw)
Get a message from aimed NETWORK.
int netw_add_msg(NETWORK *netw, N_STR *msg)
Add a message to send in aimed NETWORK.
const char * n_netw_get_connect_error(int index)
Get pre-connection error message by index.
ssize_t send_ssl_data(void *netw, char *buf, uint32_t n)
SSL Writing to a socket.
char * netw_extract_http_request_type(const char *request)
extract HTTP request type
int netw_get_queue_status(NETWORK *netw, size_t *nb_to_send, size_t *nb_to_read)
get queue status
int netw_bind_udp(NETWORK **netw, char *addr, char *port, int ip_version)
Create a UDP bound socket.
int netw_set_crypto_pem(NETWORK *netw, const char *key_pem, const char *cert_pem)
set SSL from PEM strings in memory
int netw_init_wsa(int mode, int v1, int v2)
Used by Init & Close network.
int netw_ssl_set_verify(NETWORK *netw, int enable)
enable or disable peer certificate verification
ssize_t send_php(SOCKET s, int _code, char *buf, int n)
sending to php
int netw_stop_thr_engine(NETWORK *netw)
Stop a NETWORK connection sending and receiving thread.
void n_ws_close(N_WS_CONN *conn)
send close frame and close the connection
char * netw_urlencode(const char *str, size_t len)
URL-encode a string.
N_STR * n_url_encode(const char *str)
percent-encode a string for use in URLs (returns N_STR)
void * netw_send_func(void *NET)
Thread Sending management function.
NETWORK * netw_accept_nonblock_from(NETWORK *from, int blocking)
Accepting routine.
int netw_get_url_from_http_request(const char *request, char *url, size_t size)
get URL from HTTP request
N_PROXY_CFG * n_proxy_cfg_parse(const char *url)
Parse a proxy URL string into an N_PROXY_CFG struct.
#define N_ENUM_netw_code_type(_)
Network codes definition.
int netw_set_crypto(NETWORK *netw, char *key, char *certificate)
set SSL
int netw_set_crypto_chain_pem(NETWORK *netw, const char *key_pem, const char *cert_pem, const char *ca_pem)
set SSL certificate chain from PEM strings in memory
int netw_ssl_set_ca(NETWORK *netw, const char *ca_file, const char *ca_path)
set custom CA verify path or file
void n_sse_stop(N_SSE_CONN *conn)
signal the SSE connection to stop reading
int netw_get_http_date(char *buffer, size_t buffer_size)
get current HTTP date string
NETWORK_POOL * netw_new_pool(size_t nb_min_element)
init pools
int netw_set_user_id(NETWORK *netw, int id)
set user id on a netw
void n_mock_server_free(N_MOCK_SERVER **server)
free a mock server and close the listening socket
ssize_t recv_data(void *netw, char *buf, uint32_t n)
Reading from a socket.
int netw_init_openssl(void)
init ssl helper
void n_netw_clear_errors(NETWORK *netw)
Clear captured errors on a NETWORK handle.
ssize_t recv_ssl_data(void *netw, char *buf, uint32_t n)
SSL Reading from a socket.
int netw_make_listening(NETWORK **netw, char *addr, char *port, int nbpending, int ip_version)
Listening network.
int netw_ssl_do_handshake(NETWORK *netw, const char *sni_hostname)
complete the SSL handshake on a NETWORK whose ctx was already created
ssize_t send_udp_data(void *netw, char *buf, uint32_t n)
UDP send data to connected peer or specified addr.
const char * n_netw_get_error(NETWORK *netw, int index)
Get captured error message by index (0 = oldest).
int netw_start_thr_engine(NETWORK *netw)
Create the sending and receiving thread of a NETWORK.
int netw_destroy_pool(NETWORK_POOL **netw_pool)
destroy pool
void n_url_free(N_URL **u)
free a N_URL and all its members
int netw_wait_close(NETWORK **netw)
Closing for peer.
int netw_build_http_response(N_STR **http_response, int status_code, const char *server_name, const char *content_type, char *additional_headers, N_STR *body)
build HTTP response
void * netw_recv_func(void *NET)
Thread Receiving management function.
void n_sse_conn_free(N_SSE_CONN **conn)
free an SSE connection
int n_proxy_connect_tunnel_ssl(const N_PROXY_CFG *proxy, const char *target_host, int target_port)
Open a TCP connection through an HTTPS proxy using CONNECT tunneling.
N_STR * n_url_decode(const char *str)
decode a percent-encoded string (returns N_STR)
N_WS_CONN * n_ws_connect(const char *host, const char *port, const char *path, int use_ssl)
connect to a WebSocket server (ws:// or wss://) and perform the HTTP/1.1 upgrade handshake
size_t htonst(size_t value)
host to network size_t
int netw_unload_openssl(void)
unload ssl helper
int n_proxy_connect_socks5(const N_PROXY_CFG *proxy, const char *target_host, int target_port)
Open a TCP connection through a SOCKS5 proxy.
size_t ntohst(size_t value)
network to host size_t
ssize_t(* netw_func)(void *, char *, uint32_t)
send/recv func ptr type
ssize_t netw_udp_sendto(NETWORK *netw, char *buf, uint32_t n, struct sockaddr *dest_addr, socklen_t dest_len)
UDP sendto with explicit destination.
size_t netw_pool_nbclients(NETWORK_POOL *netw_pool)
get nb clients
int n_proxy_connect_tunnel(const N_PROXY_CFG *proxy, const char *target_host, int target_port)
Open a TCP connection through an HTTP proxy using CONNECT tunneling.
NETWORK * netw_accept_from_ex(NETWORK *from, size_t send_list_limit, size_t recv_list_limit, int blocking, int *retval)
Accepting routine extended.
void n_netw_clear_connect_errors(void)
Clear pre-connection errors on this thread.
void n_mock_server_stop(N_MOCK_SERVER *server)
signal the mock server to stop accepting connections
int netw_connect_ex(NETWORK **netw, char *host, char *port, size_t send_list_limit, size_t recv_list_limit, int ip_version, char *ssl_key_file, char *ssl_cert_file)
Connecting, extended.
int SOCKET
default socket declaration
int n_netw_get_error_count(NETWORK *netw)
Get number of captured errors on a NETWORK handle.
int netw_pool_broadcast(NETWORK_POOL *netw_pool, const NETWORK *from, N_STR *net_msg)
broadcast message to pool
void n_sse_event_clean(N_SSE_EVENT *event)
free an SSE event's contents (does not free the event struct itself)
int netw_setsockopt(NETWORK *netw, int optname, int value)
Set common socket options (disable naggle, send/recv buf, reuse addr)
int netw_set(NETWORK *netw, int flag)
Set flags on network.
ssize_t send_data(void *netw, char *buf, uint32_t n)
Writing to a socket.
ssize_t recv_udp_data(void *netw, char *buf, uint32_t n)
UDP recv data from socket.
int netw_get_state(NETWORK *netw, uint32_t *state, int *thr_engine_status)
Get flags from network.
N_URL * n_url_parse(const char *url)
parse a URL string into components
void netw_pool_netw_close(void *netw_ptr)
close pool
int n_netw_get_connect_error_count(void)
Get number of pre-connection errors captured on this thread.
size_t netw_calculate_urlencoded_size(const char *str, size_t len)
calculate URL-encoded size
int deplete_send_buffer(int fd, int timeout)
wait for send buffer to be empty
NETWORK * netw_accept_from(NETWORK *from)
Accepting routine.
void n_proxy_cfg_free(N_PROXY_CFG **cfg)
Free an N_PROXY_CFG created by n_proxy_cfg_parse().
int netw_close(NETWORK **netw)
Closing.
N_STR * n_url_build(const N_URL *u)
build a URL string from parsed components
void n_mock_server_run(N_MOCK_SERVER *server)
run the mock server accept loop (blocks until stop_flag is set)
int netw_send_quit(NETWORK *netw)
send quit message
int netw_ssl_connect_client(NETWORK **netw, char *host, char *port, int ip_version)
connect as SSL client without client certificate (TCP + SSL_CTX, no handshake yet)
const char * netw_get_http_status_message(int status_code)
get HTTP status message string
int netw_set_crypto_chain(NETWORK *netw, char *key, char *certificate, char *ca_file)
set SSL certificate chain from PEM file
int n_ws_recv(N_WS_CONN *conn, N_WS_MESSAGE *msg_out)
receive one WebSocket frame
int netw_set_blocking(NETWORK *netw, unsigned long int is_blocking)
set blocking mode
N_STR * netw_wait_msg(NETWORK *netw, unsigned int refresh, size_t timeout)
Wait a message from aimed NETWORK.
int netw_send_string_to(NETWORK *netw, int id_to, N_STR *name, N_STR *chan, N_STR *txt, int color)
send string to a specific target
int netw_send_ping(NETWORK *netw, int type, int id_from, int id_to, int time)
send ping message
int netw_ssl_connect(NETWORK **netw, char *host, char *port, int ip_version, char *ssl_key_file, char *ssl_cert_file)
connect ssl helper
NETWORK_HTTP_INFO netw_extract_http_info(char *request)
extract HTTP info from request
int netw_connect(NETWORK **netw, char *host, char *port, int ip_version)
Connecting.
N_MOCK_SERVER * n_mock_server_start(int port, void(*on_request)(N_HTTP_REQUEST *, N_HTTP_RESPONSE *, void *), void *user_data)
start a mock HTTP server on localhost:port (returns immediately)
__netw_code_type
Network codes declaration.
int netw_send_ident(NETWORK *netw, int type, int id, N_STR *name, N_STR *passwd)
send ident message
char * netw_urldecode(const char *str)
URL-decode a string.
int netw_ssl_set_client_cert(NETWORK *netw, const char *cert_file, const char *key_file)
load client certificate and private key for mTLS
void n_ws_conn_free(N_WS_CONN **conn)
free a WebSocket connection structure
N_SSE_CONN * n_sse_connect(const char *host, const char *port, const char *path, int use_ssl, void(*on_event)(N_SSE_EVENT *, N_SSE_CONN *, void *), void *user_data)
connect to an SSE endpoint and start reading events (blocks until stopped)
int netw_pool_add(NETWORK_POOL *netw_pool, NETWORK *netw)
add network to pool
int netw_connect_udp(NETWORK **netw, char *host, char *port, int ip_version)
Connect a UDP socket to a remote host.
int netw_info_destroy(NETWORK_HTTP_INFO http_request)
destroy HTTP info structure
HASH_TABLE * netw_parse_post_data(const char *post_data)
parse POST data into hash table
const char * netw_guess_http_content_type(const char *url)
guess HTTP content type from URL
int n_ws_send(N_WS_CONN *conn, const char *payload, size_t len, int opcode)
send a WebSocket frame (client always masks)
ssize_t recv_php(SOCKET s, int *_code, char **buf)
receive from php
int netw_send_position(NETWORK *netw, int id, double X, double Y, double vx, double vy, double acc_x, double acc_y, int time_stamp)
send position message
int netw_pool_remove(NETWORK_POOL *netw_pool, NETWORK *netw)
remove network from pool
int netw_add_msg_ex(NETWORK *netw, char *str, unsigned int length)
Add a char message to send in the aimed NETWORK.
int netw_wait_close_timed(NETWORK **netw, size_t timeout)
Closing for peer with timeout.
ssize_t netw_udp_recvfrom(NETWORK *netw, char *buf, uint32_t n, struct sockaddr *src_addr, socklen_t *src_len)
UDP recvfrom with source address capture.
parsed HTTP request for mock server callback
HTTP response to send from mock server callback.
Parsed proxy URL components.
SSE event received from server.
a single query parameter key=value pair
structure for splitting HTTP requests
structure of a network pool
Common headers and low-level functions & define.
Hash functions and table.
List structures and definitions.
N_STR and string function declaration.