From 71a73869218fee8317186d8c63622ccf405df376 Mon Sep 17 00:00:00 2001 From: armatusmiles <akurotych@gmail.com> Date: Tue, 28 Aug 2018 15:33:47 +0300 Subject: [PATCH] [+] traffic_track module template --- dap_server.c | 10 +++++----- dap_server.h | 2 +- dap_server_client.c | 34 +++++++++++++--------------------- dap_server_client.h | 32 ++++++++++++++++---------------- dap_traffic_track.c | 36 ++++++++++++++++++++++++++++++++++++ dap_traffic_track.h | 29 +++++++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 43 deletions(-) create mode 100644 dap_traffic_track.c create mode 100644 dap_traffic_track.h diff --git a/dap_server.c b/dap_server.c index 28c412f..244a96f 100644 --- a/dap_server.c +++ b/dap_server.c @@ -100,7 +100,7 @@ dap_server_t * dap_server_new() */ void dap_server_delete(dap_server_t * sh) { - dap_client_remote_t * dap_cur, * tmp; + dap_server_client_t * dap_cur, * tmp; if(sh->address) free(sh->address); @@ -141,17 +141,16 @@ static void async_cb (EV_P_ ev_async *w, int revents) static void read_write_cb (struct ev_loop* loop, struct ev_io* watcher, int revents) { dap_server_t* sh = watcher->data; - dap_client_remote_t* dap_cur = dap_client_find(watcher->fd, sh); + dap_server_client_t* dap_cur = dap_client_find(watcher->fd, sh); if ( revents & EV_READ ) { if(dap_cur) { - int bytes_read = recv(dap_cur->socket, + ssize_t bytes_read = recv(dap_cur->socket, dap_cur->buf_in + dap_cur->buf_in_size, sizeof(dap_cur->buf_in) - dap_cur->buf_in_size, 0); - if(bytes_read > 0) { dap_cur->buf_in_size += bytes_read; @@ -182,7 +181,7 @@ static void read_write_cb (struct ev_loop* loop, struct ev_io* watcher, int reve { for(size_t total_sent = 0; total_sent < dap_cur->buf_out_size;) { //log_it(L_DEBUG, "Output: %u from %u bytes are sent ", total_sent, dap_cur->buf_out_size); - int bytes_sent = send(dap_cur->socket, + ssize_t bytes_sent = send(dap_cur->socket, dap_cur->buf_out + total_sent, dap_cur->buf_out_size - total_sent, MSG_DONTWAIT | MSG_NOSIGNAL ); @@ -280,6 +279,7 @@ dap_server_t* dap_server_listen(const char * addr, uint16_t port, dap_server_typ void* thread_loop(void * arg) { + (void)arg; log_it(L_NOTICE, "Start loop listener socket thread"); ev_loop(listener_clients_loop, 0); return NULL; diff --git a/dap_server.h b/dap_server.h index 50231b0..3ce0162 100644 --- a/dap_server.h +++ b/dap_server.h @@ -44,7 +44,7 @@ typedef struct dap_server{ uint16_t port; // Listen port char * address; // Listen address - dap_client_remote_t * clients; // Hashmap of clients + dap_server_client_t * clients; // Hashmap of clients int socket_listener; // Socket for listener int epoll_fd; // Epoll fd diff --git a/dap_server_client.c b/dap_server_client.c index bb554f9..d0432a1 100644 --- a/dap_server_client.c +++ b/dap_server_client.c @@ -31,7 +31,6 @@ #define LOG_TAG "dap_client_remote" - /** * @brief dap_client_init Init clients module * @return Zero if ok others if no @@ -56,12 +55,12 @@ void dap_client_remote_deinit() * @param s Client's socket * @return Pointer to the new list's node */ -dap_client_remote_t * dap_client_create(dap_server_t * sh, int s, ev_io* w_client) +dap_server_client_t * dap_client_create(dap_server_t * sh, int s, ev_io* w_client) { pthread_mutex_lock(&sh->mutex_on_hash); log_it(L_DEBUG, "Client structure create"); - dap_client_remote_t * ret = DAP_NEW_Z(dap_client_remote_t); + dap_server_client_t * ret = DAP_NEW_Z(dap_server_client_t); ret->socket = s; ret->server = sh; ret->watcher_client = w_client; @@ -81,9 +80,9 @@ dap_client_remote_t * dap_client_create(dap_server_t * sh, int s, ev_io* w_clien * @param sh * @return */ -dap_client_remote_t * dap_client_find(int sock, struct dap_server * sh) +dap_server_client_t * dap_client_find(int sock, struct dap_server * sh) { - dap_client_remote_t * ret = NULL; + dap_server_client_t * ret = NULL; pthread_mutex_lock(&sh->mutex_on_hash); HASH_FIND_INT(sh->clients, &sock, ret); pthread_mutex_unlock(&sh->mutex_on_hash); @@ -95,11 +94,10 @@ dap_client_remote_t * dap_client_find(int sock, struct dap_server * sh) * @param sc * @param isReady */ -void dap_client_ready_to_read(dap_client_remote_t * sc,bool is_ready) +void dap_client_ready_to_read(dap_server_client_t * sc,bool is_ready) { if(is_ready != sc->_ready_to_read) { - - uint32_t events = 0; + int events = 0; sc->_ready_to_read=is_ready; if(sc->_ready_to_read) @@ -117,11 +115,10 @@ void dap_client_ready_to_read(dap_client_remote_t * sc,bool is_ready) * @param sc * @param isReady */ -void dap_client_ready_to_write(dap_client_remote_t * sc,bool is_ready) +void dap_client_ready_to_write(dap_server_client_t * sc,bool is_ready) { if(is_ready != sc->_ready_to_write) { - - uint32_t events = 0; + int events = 0; sc->_ready_to_write=is_ready; if(sc->_ready_to_read) @@ -139,7 +136,7 @@ void dap_client_ready_to_write(dap_client_remote_t * sc,bool is_ready) * @brief safe_client_remove Removes the client from the list * @param sc Client instance */ -void dap_client_remove(dap_client_remote_t *sc, struct dap_server * sh) +void dap_client_remove(dap_server_client_t *sc, struct dap_server * sh) { pthread_mutex_lock(&sh->mutex_on_hash); @@ -164,7 +161,7 @@ void dap_client_remove(dap_client_remote_t *sc, struct dap_server * sh) * @param data_size Size of data to write * @return Number of bytes that were placed into the buffer */ -size_t dap_client_write(dap_client_remote_t *sc, const void * data, size_t data_size) +size_t dap_client_write(dap_server_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); @@ -178,7 +175,7 @@ size_t dap_client_write(dap_client_remote_t *sc, const void * data, size_t data_ * @param a_format Format * @return Number of bytes that were placed into the buffer */ -size_t dap_client_write_f(dap_client_remote_t *a_client, const char * a_format,...) +size_t dap_client_write_f(dap_server_client_t *a_client, const char * a_format,...) { size_t max_data_size = sizeof(a_client->buf_out)-a_client->buf_out_size; va_list ap; @@ -201,13 +198,8 @@ size_t dap_client_write_f(dap_client_remote_t *a_client, const char * a_format,. * @param data_size Size of data to read * @return Actual bytes number that were read */ -size_t dap_client_read(dap_client_remote_t *sc, void * data, size_t data_size) +size_t dap_client_read(dap_server_client_t *sc, void * data, size_t data_size) { - - //log_it(L_DEBUG, "Size of package: %d\n", (int)data_size); - // - // hexdump(data, data_size); packet dump - 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); @@ -227,7 +219,7 @@ size_t dap_client_read(dap_client_remote_t *sc, void * data, size_t data_size) * @param cl Client instance * @param shrink_size Size on wich we shrink the buffer with shifting it left */ -void dap_client_shrink_buf_in(dap_client_remote_t * cl, size_t shrink_size) +void dap_client_shrink_buf_in(dap_server_client_t * cl, size_t shrink_size) { if((shrink_size==0)||(cl->buf_in_size==0) ){ return; diff --git a/dap_server_client.h b/dap_server_client.h index f857572..e783e0e 100644 --- a/dap_server_client.h +++ b/dap_server_client.h @@ -29,13 +29,13 @@ typedef struct dap_server dap_server_t; -struct dap_client_remote; +struct dap_server_client; -typedef void (*dap_client_remote_callback_t) (struct dap_client_remote *,void * arg); // Callback for specific client operations +typedef void (*dap_client_remote_callback_t) (struct dap_server_client *,void * arg); // Callback for specific client operations -#define DAP_CLIENT_REMOTE_BUF 100000 +#define DAP_CLIENT_REMOTE_BUF 10000 -typedef struct dap_client_remote{ +typedef struct dap_server_client{ int socket; bool signal_close; @@ -61,27 +61,27 @@ typedef struct dap_client_remote{ void * _internal; void * _inheritor; // Internal data to specific client type, usualy states for state machine -} dap_client_remote_t; // Node of bidirectional list of clients +} dap_server_client_t; // Node of bidirectional list of clients int dap_client_remote_init(void); // Init clients module void dap_client_remote_deinit(void); // Deinit clients module -dap_client_remote_t * dap_client_create(struct dap_server * sh, int s, ev_io* w_client); // Create new client and add it to the list -dap_client_remote_t * dap_client_find(int sock, struct dap_server * sh); // Find client by socket +dap_server_client_t * dap_client_create(struct dap_server * sh, int s, ev_io* w_client); // Create new client and add it to the list +dap_server_client_t * dap_client_find(int sock, struct dap_server * sh); // Find client by socket -bool dap_client_is_ready_to_read(dap_client_remote_t * sc); -bool dap_client_is_ready_to_write(dap_client_remote_t * sc); -void dap_client_ready_to_read(dap_client_remote_t * sc,bool is_ready); -void dap_client_ready_to_write(dap_client_remote_t * sc,bool is_ready); +bool dap_client_is_ready_to_read(dap_server_client_t * sc); +bool dap_client_is_ready_to_write(dap_server_client_t * sc); +void dap_client_ready_to_read(dap_server_client_t * sc,bool is_ready); +void dap_client_ready_to_write(dap_server_client_t * sc,bool is_ready); -size_t dap_client_write(dap_client_remote_t *sc, const void * data, size_t data_size); -size_t dap_client_write_f(dap_client_remote_t *a_client, const char * a_format,...); -size_t dap_client_read(dap_client_remote_t *sc, void * data, size_t data_size); +size_t dap_client_write(dap_server_client_t *sc, const void * data, size_t data_size); +size_t dap_client_write_f(dap_server_client_t *a_client, const char * a_format,...); +size_t dap_client_read(dap_server_client_t *sc, void * data, size_t data_size); -void dap_client_remove(dap_client_remote_t *sc, struct dap_server * sh); // Removes the client from the list +void dap_client_remove(dap_server_client_t *sc, struct dap_server * sh); // Removes the client from the list -void dap_client_shrink_buf_in(dap_client_remote_t * cl, size_t shrink_size); +void dap_client_shrink_buf_in(dap_server_client_t * cl, size_t shrink_size); #endif diff --git a/dap_traffic_track.c b/dap_traffic_track.c new file mode 100644 index 0000000..007888a --- /dev/null +++ b/dap_traffic_track.c @@ -0,0 +1,36 @@ +#include "dap_traffic_track.h" +#include "dap_common.h" + +#define LOG_TAG "dap_traffic_track" + +static dap_traffic_callback_t callback; +static dap_server_client_t * server_clients; +static ev_timer timeout_watcher; +static struct ev_loop *loop; + +static void timeout_cb() +{ + log_it(L_DEBUG, "timeout_cb CB"); +} + +void dap_traffic_track_init(dap_server_client_t * clients, + time_t timeout) +{ + server_clients = clients; + timeout_watcher.repeat = timeout; + loop = EV_DEFAULT; + ev_init(&timeout_watcher, timeout_cb); + ev_timer_again (loop, &timeout_watcher); + log_it(L_NOTICE, "Initialized traffic track module"); +} + +void dap_traffic_track_deinit() +{ + ev_timer_stop (loop, &timeout_watcher); + log_it(L_NOTICE, "Deinitialized traffic track module"); +} + +void dap_traffic_set_callback(dap_traffic_callback_t cb) +{ + callback = cb; +} diff --git a/dap_traffic_track.h b/dap_traffic_track.h new file mode 100644 index 0000000..a8a8886 --- /dev/null +++ b/dap_traffic_track.h @@ -0,0 +1,29 @@ +#ifndef _TRAFFIC_TRACK_H_ +#define _TRAFFIC_TRACK_H_ +#include "dap_server_client.h" + +typedef struct dap_traffic_info { + dap_server_client_t * client; + size_t traffic_speed_bytes; +} dap_traffic_info_t; + +typedef void (*dap_traffic_callback_t) (struct dap_traffic_info *, size_t count_info); // Callback for specific server's operations + +/** + * @brief dap_traffic_track_init + * @param clients + * @param timeout callback + */ +void dap_traffic_track_init(dap_server_client_t * clients, + time_t timeout); + +/** + * @brief dap_traffic_track_deinit + */ +void dap_traffic_track_deinit(void); + +/** + * @brief dap_traffic_add_callback + */ +void dap_traffic_set_callback(dap_traffic_callback_t); +#endif -- GitLab