diff --git a/udp_server/CMakeLists.txt b/udp_server/CMakeLists.txt index 920e35e9d51af2929b8194cd7c4fa7bd2a0f2e7e..ad880dfbff401f1366f7b9b23f762a7eb64024e1 100644 --- a/udp_server/CMakeLists.txt +++ b/udp_server/CMakeLists.txt @@ -6,9 +6,13 @@ set(DAP_UDP_SERVER_SRCS dap_udp_server.c dap_udp_client.h dap_udp_client.c ) include_directories("${INCLUDE_DIRECTORIES} ${dap_core_INCLUDE_DIRS}") include_directories("${INCLUDE_DIRECTORIES} ${dap_crypto_INCLUDE_DIRS}") +include_directories("${INCLUDE_DIRECTORIES} ${dap_client_INCLUDE_DIRS}") + add_definitions ("${dap_core_DEFINITIONS}") add_definitions ("${dap_crypto_DEFINITIONS}") +add_definitions ("${dap_client_DEFINITIONS}") + add_library(${PROJECT_NAME} STATIC ${DAP_UDP_SERVER_SRCS}) set(${PROJECT_NAME}_DEFINITIONS CACHE INTERNAL "${PROJECT_NAME}: Definitions" FORCE) diff --git a/udp_server/dap_udp_client.c b/udp_server/dap_udp_client.c index b8dd4d9fca5b9495f5a6baf6aa0daec981c41e41..2bee5affd4d2213a1c47c697ab1734b7b6b8bcd2 100644 --- a/udp_server/dap_udp_client.c +++ b/udp_server/dap_udp_client.c @@ -35,25 +35,6 @@ #define LOG_TAG "udp_client" - -/** - * @brief udp_client_init Init clients module - * @return Zero if ok others if no - */ -int dap_udp_client_init() -{ - log_it(L_NOTICE,"Initialized socket client module"); - return 0; -} - -/** - * @brief udp_client_deinit Deinit clients module - */ -void dap_udp_client_deinit() -{ - -} - /** * @brief get_key Make key for hash table from host and port * @return 64 bit Key @@ -73,24 +54,31 @@ uint64_t get_key(unsigned long host,unsigned short port){ * @param port Client port * @return Pointer to the new list's node */ -dap_udp_client_t * dap_udp_client_create(dap_udp_server_t * sh, ev_io* w_client, unsigned long host, unsigned short port) +dap_client_remote_t * dap_udp_client_create(dap_server_t * sh, ev_io* w_client, unsigned long host, unsigned short port) { - pthread_mutex_lock(&sh->mutex_on_hash); + dap_udp_server_t* udp_server = DAP_UDP_SERVER(sh); log_it(L_DEBUG,"Client structure create"); - dap_udp_client_t * ret=DAP_NEW_Z(dap_udp_client_t); + dap_udp_client_t * inh=DAP_NEW_Z(dap_udp_client_t); + inh->host_key = get_key(host,port); + + dap_client_remote_t * ret=DAP_NEW_Z(dap_client_remote_t); + inh->client = ret; ret->server = sh; ret->watcher_client = w_client; ret->signal_close = false; - ret->host_key = get_key(host,port); ret->_ready_to_read=true; ret->_ready_to_write=false; - - HASH_ADD_INT( sh->clients, host_key, ret); + ret->_inheritor = inh; + pthread_mutex_init(&inh->mutex_on_client, NULL); + + pthread_mutex_lock(&udp_server->mutex_on_list); + HASH_ADD_INT( udp_server->clients, host_key, inh); + pthread_mutex_unlock(&udp_server->mutex_on_list); if(sh->client_new_callback) sh->client_new_callback(ret,NULL); // Init internal structure - pthread_mutex_unlock(&sh->mutex_on_hash); + return ret; } @@ -100,9 +88,10 @@ dap_udp_client_t * dap_udp_client_create(dap_udp_server_t * sh, ev_io* w_client, * @param host Variable for host address * @param host Variable for port */ -void dap_udp_client_get_address(dap_udp_client_t *client, unsigned long* host,unsigned short* port){ - *host = client->host_key >> 32; - *port = client->host_key - (*host<<32); +void dap_udp_client_get_address(dap_client_remote_t *client, unsigned long* host,unsigned short* port){ + dap_udp_client_t* udp_client = DAP_UDP_CLIENT(client); + *host = udp_client->host_key >> 32; + *port = udp_client->host_key - (*host<<32); } /** @@ -112,38 +101,20 @@ void dap_udp_client_get_address(dap_udp_client_t *client, unsigned long* host,un * @param port Source port * @return Pointer to client or NULL if not found */ -dap_udp_client_t * dap_udp_client_find(dap_udp_server_t * sh, unsigned long host,unsigned short port) +dap_client_remote_t * dap_udp_client_find(dap_server_t * sh, unsigned long host,unsigned short port) { - pthread_mutex_lock(&sh->mutex_on_hash); + dap_udp_server_t* udp_server = DAP_UDP_SERVER(sh); + pthread_mutex_lock(&udp_server->mutex_on_list); + dap_udp_client_t* inh = NULL; - dap_udp_client_t * ret = NULL; uint64_t token = get_key(host,port); - HASH_FIND_INT(sh->clients,&token,ret); + HASH_FIND_INT(udp_server->clients,&token,inh); - pthread_mutex_unlock(&sh->mutex_on_hash); - return ret; -} - -/** - * @brief udp_client_read Read data from input buffer - * @param sc Client instance - * @param data Pointer to memory where to store the data - * @param data_size Size of data to read - * @return Actual bytes number that were read - */ -size_t dap_udp_client_read(dap_udp_client_t *sc, void * data, size_t data_size) -{ - if (data_size < sc->buf_in_size) { - memcpy(data, sc->buf_in, data_size); - memmove(data, sc->buf_in + data_size, sc->buf_in_size - data_size); - } else { - if (data_size > sc->buf_in_size) { - data_size = sc->buf_in_size; - } - memcpy(data, sc->buf_in, data_size); - } - sc->buf_in_size -= data_size; - return data_size; + pthread_mutex_unlock(&udp_server->mutex_on_list); + if(inh == NULL) + return NULL; + else + return inh->client; } /** @@ -151,7 +122,7 @@ size_t dap_udp_client_read(dap_udp_client_t *sc, void * data, size_t data_size) * @param sc Client structure * @param is_ready Flag value */ -void dap_udp_client_ready_to_read(dap_udp_client_t * sc,bool is_ready) +void dap_udp_client_ready_to_read(dap_client_remote_t * sc,bool is_ready) { if(is_ready != sc->_ready_to_read) { @@ -175,10 +146,10 @@ void dap_udp_client_ready_to_read(dap_udp_client_t * sc,bool is_ready) * @param sc Client structure * @param is_ready Flag value */ -void dap_udp_client_ready_to_write(dap_udp_client_t * sc,bool is_ready) +void dap_udp_client_ready_to_write(dap_client_remote_t * sc,bool is_ready) { - if(is_ready) - add_waiting_client(sc); // Add client to writing queue + // if(is_ready) + // add_waiting_client(sc); // Add client to writing queue if(is_ready != sc->_ready_to_write) { uint32_t events = 0; sc->_ready_to_write=is_ready; @@ -196,91 +167,40 @@ void dap_udp_client_ready_to_write(dap_udp_client_t * sc,bool is_ready) } /** - * @brief udp_client_remove Removes the client from the hashmap - * @param sc Client instance - * @param sh Server instance + * @brief add_waiting_client Add Client to write queue + * @param client Client instance */ -void dap_udp_client_remove(dap_udp_client_t *sc, dap_udp_server_t * sh) -{ - pthread_mutex_lock(&sh->mutex_on_hash); - - log_it(L_DEBUG, "Client structure remove"); - HASH_DEL(sc->server->clients,sc); +void add_waiting_client(dap_client_remote_t* client){ + dap_server_t* sh = client->server; + dap_udp_server_t* udp_server = DAP_UDP_SERVER(sh); + dap_udp_client_t* udp_client = DAP_UDP_CLIENT(client); + + pthread_mutex_lock(&udp_server->mutex_on_list); + dap_udp_client_t* udp_cl, *tmp; + LL_FOREACH_SAFE(udp_server->waiting_clients,udp_cl,tmp) + if(udp_cl == udp_client) + { + pthread_mutex_unlock(&udp_server->mutex_on_list); + return; + } + LL_APPEND(udp_server->waiting_clients, udp_client); + pthread_mutex_unlock(&udp_server->mutex_on_list); - if(sc->server->client_delete_callback) - sc->server->client_delete_callback(sc,NULL); // Init internal structure - if(sc->_inheritor) - free(sc->_inheritor); - free(sc); - pthread_mutex_unlock(&sh->mutex_on_hash); } -/** - * @brief udp_client_write Write data to the client - * @param sc Client instance - * @param data Pointer to data - * @param data_size Size of data to write - * @return Number of bytes that were placed into the buffer - */ -size_t dap_udp_client_write(dap_udp_client_t *sc, const void * data, size_t data_size) -{ - data_size = ((sc->buf_out_size+data_size)<(sizeof(sc->buf_out)))?data_size:(sizeof(sc->buf_out)-sc->buf_out_size ); - memcpy(sc->buf_out+sc->buf_out_size,data,data_size); - sc->buf_out_size+=data_size; - return data_size; +size_t dap_udp_client_write(dap_client_remote_t *sc, const void * data, size_t data_size){ + size_t size = dap_client_write(sc,data,data_size); + add_waiting_client(sc); + return size; } -/** - * @brief udp_client_write_f Write formatted text to the client - * @param a_client Client instance - * @param a_format Format - * @return Number of bytes that were placed into the buffer - */ -size_t dap_udp_client_write_f(dap_udp_client_t *a_client, const char * a_format,...) -{ - size_t max_data_size = sizeof(a_client->buf_out)-a_client->buf_out_size; +size_t dap_udp_client_write_f(dap_client_remote_t *a_client, const char * a_format,...){ + size_t size = 0; va_list ap; va_start(ap,a_format); - int ret=vsnprintf(a_client->buf_out+a_client->buf_out_size,max_data_size,a_format,ap); + size =dap_client_write_f(a_client,a_format,ap); va_end(ap); - if(ret>0){ - a_client->buf_out_size+=ret; - return ret; - }else{ - log_it(L_ERROR,"Can't write out formatted data '%s'",a_format); - return 0; - } -} - -/** - * @brief add_waiting_client Add Client to write queue - * @param client Client instance - */ -void add_waiting_client(dap_udp_client_t* client){ - dap_udp_server_t* serv = client->server; - LL_APPEND(serv->waiting_clients, client); -} - - -/** - * @brief shrink_client_buf_in Shrink input buffer (shift it left) - * @param cl Client instance - * @param shrink_size Size on wich we shrink the buffer with shifting it left - */ -void dap_udp_client_shrink_buf_in(dap_udp_client_t * cl, size_t shrink_size) -{ - if((shrink_size==0)||(cl->buf_in_size==0) ){ - return; - }else if(cl->buf_in_size>shrink_size){ - size_t buf_size=cl->buf_in_size-shrink_size; - void * buf = malloc(buf_size); - memcpy(buf,cl->buf_in+ shrink_size,buf_size ); - memcpy(cl->buf_in,buf,buf_size); - cl->buf_in_size=buf_size; - free(buf); - }else { - cl->buf_in_size=0; - } - + add_waiting_client(a_client); + return size; } diff --git a/udp_server/dap_udp_client.h b/udp_server/dap_udp_client.h index 584dacfe96d8d6af59f32b25ce26e5c92ea98fdb..96b465fe5bf9615922360ea0956d87d0446cae8d 100644 --- a/udp_server/dap_udp_client.h +++ b/udp_server/dap_udp_client.h @@ -27,60 +27,39 @@ #include <stdbool.h> #include <sys/queue.h> #include "uthash.h" +#include "dap_client_remote.h" #include <ev.h> typedef struct dap_udp_server dap_udp_server_t; struct dap_udp_client; -typedef void (*dap_udp_client_callback_t) (struct udp_client *,void * arg); // Callback for specific client operations - #define UDP_CLIENT_BUF 100000 typedef struct dap_udp_client{ - bool signal_close; - - bool _ready_to_write; - bool _ready_to_read; - - uint32_t buf_out_zero_count; - char buf_in[UDP_CLIENT_BUF+1]; // Internal buffer for input data - size_t buf_in_size; // size of data that is in the input buffer - - char buf_out[UDP_CLIENT_BUF+1]; // Internal buffer for output data - size_t buf_out_size; // size of data that is in the output buffer - + dap_client_remote_t* client; uint64_t host_key; //key contains host address in first 4 bytes and port in last 4 bytes - ev_io* watcher_client; - - struct dap_udp_server * server; - UT_hash_handle hh; struct dap_udp_client *next, *prev; //pointers for writing queue + pthread_mutex_t mutex_on_client; void * _inheritor; // Internal data to specific client type, usualy states for state machine } dap_udp_client_t; // Node of bidirectional list of clients +#define DAP_UDP_CLIENT(a) ((dap_udp_client_t *) (a)->_inheritor) -int dap_udp_client_init(); // Init clients module -void dap_udp_client_deinit(); // Deinit clients module - -dap_udp_client_t * dap_udp_client_create(dap_udp_server_t * sh, ev_io* w_client, unsigned long host, unsigned short port); // Create new client and add it to the list -dap_udp_client_t * dap_udp_client_find(dap_udp_server_t * sh, unsigned long host, unsigned short port); // Find client by host and port - -void dap_udp_client_ready_to_read(dap_udp_client_t * sc,bool is_ready); -void dap_udp_client_ready_to_write(dap_udp_client_t * sc,bool is_ready); +dap_client_remote_t * dap_udp_client_create(dap_server_t * sh, ev_io* w_client, unsigned long host, unsigned short port); // Create new client and add it to the list +dap_client_remote_t * dap_udp_client_find(dap_server_t * sh, unsigned long host, unsigned short port); // Find client by host and port -size_t dap_udp_client_write(dap_udp_client_t *sc, const void * data, size_t data_size); -size_t dap_udp_client_write_f(dap_udp_client_t *a_client, const char * a_format,...); -size_t dap_udp_client_read(dap_udp_client_t *sc, void * data, size_t data_size); +void dap_udp_client_ready_to_read(dap_client_remote_t * sc,bool is_ready); +void dap_udp_client_ready_to_write(dap_client_remote_t * sc,bool is_ready); -void add_waiting_client(dap_udp_client_t* client); // Add client to writing queue +size_t dap_udp_client_write(dap_client_remote_t *sc, const void * data, size_t data_size); +size_t dap_udp_client_write_f(dap_client_remote_t *a_client, const char * a_format,...); -void dap_udp_client_remove(dap_udp_client_t *sc, dap_udp_server_t * sh); // Removes the client from the hash-table +void add_waiting_client(dap_client_remote_t* client); // Add client to writing queue -void dap_udp_client_shrink_buf_in(dap_udp_client_t * cl, size_t shrink_size); #endif \ No newline at end of file diff --git a/udp_server/dap_udp_server.c b/udp_server/dap_udp_server.c index 15c72ef0e53afa16d0ea695354b9f02406ea8b2c..02bd890c110d09c5dfefdfc3754e323965d0cecc 100644 --- a/udp_server/dap_udp_server.c +++ b/udp_server/dap_udp_server.c @@ -1,23 +1,3 @@ -/* - Copyright (c) 2017-2018 (c) Project "DeM Labs Inc" https://github.com/demlabsinc - All rights reserved. - - This file is part of DAP (Deus Applications Prototypes) the open source project - - DAP (Deus Applicaions Prototypes) is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DAP is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public License - along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. -*/ - #include "dap_udp_server.h" #include <stdio.h> #include "dap_common.h" @@ -38,24 +18,6 @@ struct ev_io w_write; static void write_cb(struct ev_loop* loop, struct ev_io* watcher, int revents); -/** - * @brief dap_udp_server_init Init server module - * @return Zero if ok others if no - */ -int dap_udp_server_init() -{ - signal(SIGPIPE, SIG_IGN); - log_it(L_NOTICE,"Initialized socket server module"); - return 0; -} - -/** - * @brief dap_udp_server_deinit Deinit server module - */ -void dap_udp_server_deinit() -{ -} - /** */ void error(char *msg) { @@ -67,11 +29,14 @@ void error(char *msg) { * @brief dap_udp_server_new Initialize server structure * @return Server pointer */ -dap_udp_server_t * dap_udp_server_new() +dap_server_t * dap_udp_server_new() { - dap_udp_server_t* server = (dap_udp_server_t*)calloc(1,sizeof(dap_udp_server_t)); - server->waiting_clients = NULL; - return server; + dap_udp_server_t* udp_server = (dap_udp_server_t*)calloc(1,sizeof(dap_udp_server_t)); + udp_server->waiting_clients = NULL; + dap_server_t* sh = (dap_server_t*) calloc(1,sizeof(dap_server_t)); + sh->_inheritor = udp_server; + udp_server->dap_server = sh; + return sh; } /** @@ -79,7 +44,7 @@ dap_udp_server_t * dap_udp_server_new() */ void* dap_udp_client_loop(void * arg) { - dap_udp_server_t* sh = (dap_udp_server_t*)arg; + dap_server_t* sh = (dap_server_t*)arg; log_it(L_NOTICE, "Start client listener thread"); struct ev_loop * ev_client_loop = ev_loop_new(0); w_write.data = sh; @@ -93,14 +58,14 @@ void* dap_udp_client_loop(void * arg) * @brief dap_udp_server_delete Safe delete server structure * @param sh Server instance */ -void dap_udp_server_delete(dap_udp_server_t * sh) +void dap_udp_server_delete(dap_server_t * sh) { if(sh->address) free(sh->address); - dap_udp_client_t * client, * tmp; + dap_client_remote_t * client, * tmp; HASH_ITER(hh,sh->clients,client,tmp) - dap_udp_client_remove(client, sh); + dap_client_remove(client, sh); if(sh->server_delete_callback) sh->server_delete_callback(sh,NULL); @@ -114,8 +79,8 @@ void dap_udp_server_delete(dap_udp_server_t * sh) * @param port Binding port * @return Server instance */ -dap_udp_server_t * dap_udp_server_listen(uint16_t port){ - dap_udp_server_t* sh = dap_udp_server_new(); +dap_server_t * dap_udp_server_listen(uint16_t port){ + dap_server_t* sh = dap_udp_server_new(); sh->socket_listener = socket (AF_INET, SOCK_DGRAM, 0); @@ -139,6 +104,7 @@ dap_udp_server_t * dap_udp_server_listen(uint16_t port){ dap_udp_server_delete(sh); return NULL; } + pthread_mutex_init(&DAP_UDP_SERVER(sh)->mutex_on_list, NULL); return sh; } @@ -148,16 +114,22 @@ dap_udp_server_t * dap_udp_server_listen(uint16_t port){ static void write_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) { if( ( revents & EV_WRITE ) ) { - dap_udp_server_t* sh = watcher->data; - dap_udp_client_t * client, * tmp; - LL_FOREACH_SAFE(sh->waiting_clients,client,tmp) - { + dap_server_t* sh = watcher->data; + dap_udp_server_t* udp = DAP_UDP_SERVER(sh); + dap_udp_client_t * udp_client, * tmp; + pthread_mutex_lock(&udp->mutex_on_list); + LL_FOREACH_SAFE(udp->waiting_clients,udp_client,tmp) + { + //log_it(L_INFO,"write_cb"); + //pthread_mutex_lock(&udp_client->mutex_on_client); + dap_client_remote_t* client = udp_client->client; if(client != NULL && check_close(client) == 0 && client->_ready_to_write) { if(sh->client_write_callback) sh->client_write_callback(client, NULL); if(client->buf_out_size > 0) { + //log_it(L_INFO,"write_cb_client"); for(size_t total_sent = 0; total_sent < client->buf_out_size;) { struct sockaddr_in addr; addr.sin_family = AF_INET; @@ -170,12 +142,16 @@ static void write_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) total_sent += bytes_sent; } client->buf_out_size = 0; + bzero(client->buf_out, DAP_CLIENT_REMOTE_BUF + 1); + } - LL_DELETE(sh->waiting_clients,client); + LL_DELETE(udp->waiting_clients,udp_client); } else if(client == NULL) - LL_DELETE(sh->waiting_clients,client); + LL_DELETE(udp->waiting_clients,udp_client); + //pthread_mutex_unlock(&udp_client->mutex_on_client); } + pthread_mutex_unlock(&udp->mutex_on_list); } } @@ -184,15 +160,17 @@ static void write_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) * @param client Client structure * @return 1 if client deleted, 0 if client is no need to delete */ -int check_close(dap_udp_client_t* client){ +int check_close(dap_client_remote_t* client){ if(client->signal_close) { - dap_udp_server_t* sh = client->server; + dap_udp_client_t* udp_client = DAP_UDP_CLIENT(client); + dap_server_t* sh = client->server; + dap_udp_server_t* udp_server = DAP_UDP_SERVER(sh); dap_udp_client_t * client_check, * tmp; - LL_FOREACH_SAFE(sh->waiting_clients,client_check,tmp) - if(client_check->host_key == client->host_key) - LL_DELETE(sh->waiting_clients,client_check); - dap_udp_client_remove(client, sh); + LL_FOREACH_SAFE(udp_server->waiting_clients,client_check,tmp) + if(client_check->host_key == udp_client->host_key) + LL_DELETE(udp_server->waiting_clients,client_check); + dap_client_remove(client, sh); return 1; } return 0; @@ -203,14 +181,15 @@ int check_close(dap_udp_client_t* client){ */ static void read_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) { + //log_it(L_INFO,"read_cb"); if ( revents & EV_READ ) { struct sockaddr_in clientaddr; int clientlen = sizeof(clientaddr); - dap_udp_server_t* sh = watcher->data; + dap_server_t* sh = watcher->data; bzero(buf, BUFSIZE); socklen_t bytes = recvfrom(sh->socket_listener, buf, BUFSIZE, 0,(struct sockaddr *) &clientaddr, &clientlen); - dap_udp_client_t *client = dap_udp_client_find(sh,clientaddr.sin_addr.s_addr,clientaddr.sin_port); + dap_client_remote_t *client = dap_udp_client_find(sh,clientaddr.sin_addr.s_addr,clientaddr.sin_port); if(client != NULL && check_close(client) != 0) return; if(bytes > 0){ @@ -229,8 +208,10 @@ static void read_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) error("ERROR create client structure\n"); } } + dap_udp_client_t* udp_client = client->_inheritor; + pthread_mutex_lock(&udp_client->mutex_on_client); size_t bytes_processed = 0; - size_t bytes_recieved = strlen(buf); + size_t bytes_recieved = bytes; while(bytes_recieved > 0){ size_t bytes_to_transfer = 0; if(bytes_recieved > UDP_CLIENT_BUF - client->buf_in_size) @@ -239,11 +220,17 @@ static void read_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) bytes_to_transfer = bytes_recieved; memcpy(client->buf_in + client->buf_in_size,buf+bytes_processed,bytes_to_transfer); client->buf_in_size += bytes_to_transfer; + if(sh->client_read_callback) sh->client_read_callback(client,NULL); + bytes_processed += bytes_to_transfer; bytes_recieved -= bytes_to_transfer; - } + } + client->buf_in_size = 0; + bzero(client->buf_in, DAP_CLIENT_REMOTE_BUF + 1); + pthread_mutex_unlock(&udp_client->mutex_on_client); + } else if(bytes < 0) { @@ -264,7 +251,7 @@ static void read_cb(struct ev_loop* loop, struct ev_io* watcher, int revents) * @brief dap_udp_server_loop Start server event loop * @param sh Server instance */ -void dap_udp_server_loop(dap_udp_server_t * sh){ +void dap_udp_server_loop(dap_server_t * sh){ sh->proc_thread.tid = pthread_self(); pthread_t thread; diff --git a/udp_server/dap_udp_server.h b/udp_server/dap_udp_server.h index e4aa672f61c13b9c4d0eed9ed0f5d6a0e3c04c36..9aa180b12e53b4510d8d74de268c8db7e842a9c9 100644 --- a/udp_server/dap_udp_server.h +++ b/udp_server/dap_udp_server.h @@ -31,6 +31,8 @@ #include <sys/select.h> #include <sys/queue.h> #include "dap_udp_client.h" +#include "dap_server.h" +#include "dap_client_remote.h" struct dap_udp_server; @@ -41,41 +43,20 @@ typedef struct dap_udp_thread{ typedef void (*dap_udp_server_callback_t) (struct dap_udp_server *,void * arg); // Callback for specific server's operations typedef struct dap_udp_server{ - uint16_t port; // Listen port - char * address; // Listen address - - dap_udp_client_t * clients; // Hashmap of clients + dap_udp_client_t * clients; dap_udp_client_t * waiting_clients; // List clients for writing data - - int socket_listener; // Socket for listener - int epoll_fd; // Epoll fd - - struct sockaddr_in listener_addr; // Kernel structure for listener's binded address - - void * _inheritor; // Pointer to the internal data, HTTP for example - - dap_udp_thread_t proc_thread; - pthread_mutex_t mutex_on_hash; - - dap_udp_server_callback_t server_delete_callback; - - dap_udp_client_callback_t client_new_callback; // Create new client callback - dap_udp_client_callback_t client_delete_callback; // Delete client callback - dap_udp_client_callback_t client_read_callback; // Read function - dap_udp_client_callback_t client_write_callback; // Write function - dap_udp_client_callback_t client_error_callback; // Error processing function - + pthread_mutex_t mutex_on_list; + void* _inheritor; + dap_server_t* dap_server; } dap_udp_server_t; -extern int dap_udp_server_init(); // Init server module - -extern void dap_udp_server_deinit(); // Deinit server module +#define DAP_UDP_SERVER(a) ((dap_udp_server_t *) (a)->_inheritor) -extern void dap_udp_server_delete(dap_udp_server_t * sh); +extern void dap_udp_server_delete(dap_server_t * sh); -extern void dap_udp_server_loop(dap_udp_server_t* udp_server); // Start server event loop +extern void dap_udp_server_loop(dap_server_t* udp_server); // Start server event loop -extern dap_udp_server_t* dap_udp_server_listen(uint16_t port); // Create and bind server +extern dap_server_t* dap_udp_server_listen(uint16_t port); // Create and bind server #endif