22static pthread_t netw_thr;
26 " -a 'serveur address name/ip to bind (server mode) (optionnal)\n"
27 " -s 'serveur address name/ip to connect (client mode)\n"
28 " -p 'port': TCP port to use, server or client\n"
29 " -c 'SSL certificate file': optional, certificale file to enable SSL encryption\n"
30 " -k 'SSL key file': optional, key file to enable SSL encrpytion\n"
31 " -i 'ipmode': optional, ip version to use. Default support both ipv4 and ipv6. Values: ipv4, ipv6\n"
32 " -h: show that help file\n"
33 " -v: show the program version\n"
34 " -V 'log level': optional, set the log level. Default: LOG_ERR, values: LOG_INFO, LOG_NOTICE, LOG_ERR, LOG_DEBUG\n");
37void process_args(
int argc,
char** argv,
char** address,
char** server,
char** port,
int* nb,
int* ip_version,
char** ssl_key_file,
char** ssl_cert_file) {
52 fprintf(stderr,
"No arguments given, help:\n");
56 while ((getoptret = getopt(argc, argv,
"hvs:V:p:n:i:a:c:k:")) != EOF) {
59 if (!strcmp(
"v4", optarg)) {
62 }
else if (!strcmp(
"v6", optarg)) {
70 fprintf(stderr,
"Date de compilation : %s a %s.\n", __DATE__, __TIME__);
73 if (!strncmp(
"LOG_NULL", optarg, 8)) {
76 if (!strncmp(
"LOG_NOTICE", optarg, 10)) {
79 if (!strncmp(
"LOG_INFO", optarg, 8)) {
82 if (!strncmp(
"LOG_ERR", optarg, 7)) {
85 if (!strncmp(
"LOG_DEBUG", optarg, 9)) {
88 fprintf(stderr,
"%s n'est pas un niveau de log valide.\n", optarg);
97 (*ssl_key_file) = strdup(optarg);
100 (*ssl_cert_file) = strdup(optarg);
103 (*server) = strdup(optarg);
106 (*address) = strdup(optarg);
109 (*nb) = atoi(optarg);
112 (*port) = strdup(optarg);
128int main(
int argc,
char** argv) {
132 char* ssl_key_file = NULL;
133 char* ssl_cert_file = NULL;
138 process_args(argc, argv, &addr, &srv, &port, &NB_ATTEMPTS, &ip_mode, &ssl_key_file, &ssl_cert_file);
146 n_log(
LOG_ERR,
"Please specify only one of the following options: -a (server, addr to bind to) or -s (server on which to connect to)");
150 n_log(
LOG_INFO,
"Client mode, connecting to %s:%s", srv, port);
153 n_log(
LOG_INFO,
"Server mode , waiting client on port %s", port);
162 if (mode == SERVER) {
166 n_log(
LOG_ERR,
"Fatal error with network initialization");
172 if (ssl_key_file && ssl_cert_file) {
178 for (it = 0; it < NB_ATTEMPTS / 2; it++) {
186 int pthread_error = 0;
188 pthread_error = pthread_create(&netw_thr, NULL, &
manage_client, (
void*)netw);
190 if (pthread_error != 0) {
191 n_log(
LOG_ERR,
"Error creating client management pthread:%d , error: %s", pthread_error, strerror(error));
195 pthread_join(netw_thr, NULL);
201 while (it < NB_ATTEMPTS) {
206 n_log(
LOG_ERR,
"Error adding client management to thread pool");
223 }
else if (mode == CLIENT) {
224 for (
int it = 1; it <= NB_ATTEMPTS; it++) {
225 if (ssl_key_file && ssl_cert_file) {
227 if (
netw_ssl_connect(&netw, srv, port, ip_mode, ssl_key_file, ssl_cert_file) != TRUE) {
229 n_log(
LOG_ERR,
"Unable to connect to %s:%s", srv, port);
233 n_log(
LOG_NOTICE,
"SSL Attempt %d: Connected to %s:%s", it, srv, port);
236 n_log(
LOG_ERR,
"trying to use SSL with %s:%s, but program was compiled without OpenSSL support !!!");
245 n_log(
LOG_ERR,
"Unable to connect to %s:%s", srv, port);
255 N_STR *sended_data = NULL, *recved_data = NULL, *hostname = NULL, *tmpstr = NULL;
265 tmpstr = netw_wait_msg(netw, 25000, 10000000);
269 n_log(
LOG_NOTICE,
"RECEIVED DATAS: %s - %s", recved_data->data, hostname->data);
274 n_log(
LOG_ERR,
"Error getting back answer from server");
276 n_log(
LOG_NOTICE,
"Closing client in 3 seconds. See synchronisation on server side...");
Nilorea Library n_network api test.
void * manage_client(void *ptr)
recv/send datas if any for the client
int get_net_datas(N_STR *str, N_STR **hostname, N_STR **data)
decode data we got from network
int send_net_datas(NETWORK *netw, N_STR *data)
send data to specified network
#define FreeNoLog(__ptr)
Free Handler without log.
#define _str(__PTR)
define true
int sigchld_handler_installer()
install signal SIGCHLD handler to reap zombie processes
#define n_log(__LEVEL__,...)
Logging function wrapper to get line and func.
#define LOG_DEBUG
debug-level messages
#define LOG_ERR
error conditions
void set_log_level(const int log_level)
Set the global log level value ( static int LOG_LEVEL )
#define LOG_NOTICE
normal but significant condition
#define LOG_NULL
no log output
#define LOG_INFO
informational
#define free_nstr(__ptr)
free a N_STR structure and set the pointer to NULL
N_STR * char_to_nstr(const char *src)
Convert a char into a N_STR, short version.
A box including a string and his lenght.
void u_sleep(unsigned int usec)
wrapper around usleep for API consistency
int netw_set_crypto(NETWORK *netw, char *key, char *certificate)
activate SSL encryption on selected network, using key and certificate
#define NETWORK_IPV6
Flag to force IPV6
int netw_make_listening(NETWORK **netw, char *addr, char *port, int nbpending, int ip_version)
Make a NETWORK be a Listening network.
int netw_start_thr_engine(NETWORK *netw)
Start the NETWORK netw Threaded Engine.
#define NETWORK_IPV4
Flag to force IPV4
NETWORK * netw_accept_from_ex(NETWORK *from, size_t send_list_limit, size_t recv_list_limit, int blocking, int *retval)
make a normal 'accept' .
#define NETWORK_IPALL
Flag for auto detection by OS of ip version to use.
#define NETWORK_WAIT_CLOSE_TIMEOUT
Flag to set network closing wait timeout.
int netw_setsockopt(NETWORK *netw, int optname, int value)
Modify common socket options on the given netw.
NETWORK * netw_accept_from(NETWORK *from)
make a normal blocking 'accept' .
int netw_close(NETWORK **netw)
Closing a specified Network, destroy queues, free the structure.
int netw_ssl_connect(NETWORK **netw, char *host, char *port, int ip_version, char *ssl_key_file, char *ssl_cert_file)
Use this to connect a NETWORK to any listening one, unrestricted send/recv lists.
int netw_connect(NETWORK **netw, char *host, char *port, int ip_version)
Use this to connect a NETWORK to any listening one, unrestricted send/recv lists.
THREAD_POOL * new_thread_pool(size_t nbmaxthr, size_t nb_max_waiting)
Create a new pool of nbmaxthr threads.
int add_threaded_process(THREAD_POOL *thread_pool, void *(*func_ptr)(void *param), void *param, int mode)
add a function and params to a thread pool
int refresh_thread_pool(THREAD_POOL *thread_pool)
try to add some waiting DIRECT_PROCs on some free thread slots, else do nothing
int destroy_threaded_pool(THREAD_POOL **pool, unsigned int delay)
delete a thread_pool, exit the threads and free the structs
#define DIRECT_PROC
processing mode for added func, direct start
int wait_for_threaded_pool(THREAD_POOL *thread_pool, unsigned int delay)
Wait for all the launched process in the thread pool to terminate.
Structure of a trhead pool.