From 9818b9c52fbff257abdef9ee7f29f8ef46214274 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Thu, 24 Sep 2020 17:35:51 +0000 Subject: [PATCH] bugs-4415 --- CMakeLists.txt | 4 +- dap-sdk/CMakeLists.txt | 4 +- dap-sdk/net/client/CMakeLists.txt | 2 +- dap-sdk/net/client/dap_client_http.c | 3 +- dap-sdk/net/client/dap_client_pvt.c | 1 + dap-sdk/net/core/dap_events_socket.c | 8 +- dap-sdk/net/core/dap_server.c | 38 +- dap-sdk/net/core/dap_worker.c | 28 +- dap-sdk/net/core/include/dap_events_socket.h | 7 +- dap-sdk/net/core/include/dap_server.h | 8 +- dap-sdk/net/server-udp/CMakeLists.txt | 19 - dap-sdk/net/server-udp/dap_udp_client.c | 185 -------- dap-sdk/net/server-udp/dap_udp_server.c | 399 ------------------ .../net/server-udp/include/dap_udp_client.h | 66 --- .../net/server-udp/include/dap_udp_server.h | 63 --- dap-sdk/net/server-udp/test/CMakeLists.txt | 20 - dap-sdk/net/server-udp/test/main.c | 5 - .../net/server/http_server/dap_http_simple.c | 1 - dap-sdk/net/stream/ch/CMakeLists.txt | 2 +- dap-sdk/net/stream/stream/CMakeLists.txt | 2 +- dap-sdk/net/stream/stream/dap_stream.c | 12 +- dap-sdk/net/stream/stream/dap_stream_pkt.c | 1 - .../net/stream/stream/include/dap_stream.h | 4 +- modules/net/dap_chain_net.c | 7 +- modules/net/dap_chain_node_cli.c | 1 + modules/net/dap_chain_node_client.c | 4 + modules/net/dap_chain_node_ping.c | 3 + modules/net/dap_dns_server.c | 37 +- modules/net/include/dap_dns_server.h | 3 +- .../service/vpn/dap_chain_net_vpn_client.c | 3 + 30 files changed, 107 insertions(+), 833 deletions(-) delete mode 100644 dap-sdk/net/server-udp/CMakeLists.txt delete mode 100644 dap-sdk/net/server-udp/dap_udp_client.c delete mode 100644 dap-sdk/net/server-udp/dap_udp_server.c delete mode 100644 dap-sdk/net/server-udp/include/dap_udp_client.h delete mode 100644 dap-sdk/net/server-udp/include/dap_udp_server.h delete mode 100644 dap-sdk/net/server-udp/test/CMakeLists.txt delete mode 100644 dap-sdk/net/server-udp/test/main.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 4b4350d04b..8a6fec0190 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.5-18") +set(CELLFRAME_SDK_NATIVE_VERSION "2.5-19") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") @@ -55,7 +55,7 @@ endif() # Networking if (CELLFRAME_MODULES MATCHES "network") message("[+] Module 'network'") - set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_server_core dap_enc_server dap_http_server dap_udp_server dap_session + set(CELLFRAME_LIBS ${CELLFRAME_LIBS} dap_server_core dap_enc_server dap_http_server dap_session dap_stream dap_stream_ch dap_client dap_stream_ch_chain dap_stream_ch_chain_net dap_chain_net dap_chain_mempool magic) endif() diff --git a/dap-sdk/CMakeLists.txt b/dap-sdk/CMakeLists.txt index cc44d581e1..02650ba37b 100644 --- a/dap-sdk/CMakeLists.txt +++ b/dap-sdk/CMakeLists.txt @@ -1,4 +1,4 @@ -set(DAP_SDK_NATIVE_VERSION "2.0-11") +set(DAP_SDK_NATIVE_VERSION "2.0-13") # Core if (DAPSDK_MODULES MATCHES "core") # Core @@ -22,5 +22,5 @@ endif() # Networking server if (DAPSDK_MODULES MATCHES "network-server") add_subdirectory(net/server) - add_subdirectory(net/server-udp) +# add_subdirectory(net/server-udp) endif() diff --git a/dap-sdk/net/client/CMakeLists.txt b/dap-sdk/net/client/CMakeLists.txt index 00f855bceb..7487547876 100644 --- a/dap-sdk/net/client/CMakeLists.txt +++ b/dap-sdk/net/client/CMakeLists.txt @@ -12,7 +12,7 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_CLIENT_HEADERS} ${DAP_CLIENT_SOURCES}) -target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_udp_server dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c) +target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core dap_http_server dap_enc_server dap_stream dap_session dap_stream_ch json-c) if(UNIX AND NOT ANDROID) target_link_libraries(${PROJECT_NAME} rt) diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c index 79ca6f4484..7eb3b44e1b 100644 --- a/dap-sdk/net/client/dap_client_http.c +++ b/dap-sdk/net/client/dap_client_http.c @@ -30,7 +30,8 @@ // for Unix-like systems #include <sys/types.h> #include <sys/socket.h> -//#include <bits/socket_type.h> +#include <netdb.h> +#include <arpa/inet.h> #endif #include <unistd.h> #include <errno.h> diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index 9a97bc1e8f..f2be7f840f 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -45,6 +45,7 @@ #else #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> +#include <arpa/inet.h> #endif #include <pthread.h> diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index 8f4f017504..c7acd09a14 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -652,12 +652,10 @@ dap_events_socket_t * dap_events_socket_wrap2( dap_server_t *a_server, struct da ret->socket = a_sock; ret->events = a_events; ret->server = a_server; - ret->is_dont_reset_write_flag = true; memcpy(&ret->callbacks,a_callbacks, sizeof ( ret->callbacks) ); ret->flags = DAP_SOCK_READY_TO_READ; - ret->is_pingable = true; ret->last_time_active = ret->last_ping_request = time( NULL ); pthread_rwlock_wrlock( &a_events->sockets_rwlock ); @@ -693,7 +691,7 @@ dap_events_socket_t *dap_events_socket_find_unsafe( int sock, struct dap_events */ void dap_events_socket_set_readable_unsafe( dap_events_socket_t *sc, bool is_ready ) { - if( is_ready == (bool)(sc->flags & DAP_SOCK_READY_TO_READ) ) + if( is_ready == (bool)(sc->flags & DAP_SOCK_READY_TO_READ)) return; sc->ev.events = sc->ev_base_flags; @@ -730,7 +728,7 @@ void dap_events_socket_set_readable_unsafe( dap_events_socket_t *sc, bool is_rea */ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *sc, bool a_is_ready ) { - if ( a_is_ready == (bool)(sc->flags & DAP_SOCK_READY_TO_WRITE) ) { + if ( a_is_ready == (bool)(sc->flags & DAP_SOCK_READY_TO_WRITE)) { return; } @@ -750,7 +748,7 @@ void dap_events_socket_set_writable_unsafe( dap_events_socket_t *sc, bool a_is_r sc->ev.events = events; - if (sc->worker) + if (sc->worker && sc->server->type != DAP_SERVER_UDP) if ( epoll_ctl(sc->worker->epoll_fd, EPOLL_CTL_MOD, sc->socket, &sc->ev) ){ int l_errno = errno; char l_errbuf[128]; diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c index 6f49c82989..e57d203d23 100644 --- a/dap-sdk/net/core/dap_server.c +++ b/dap-sdk/net/core/dap_server.c @@ -64,7 +64,6 @@ static dap_events_socket_t * s_es_server_create(dap_events_t * a_events, int a_s static void s_es_server_accept(dap_events_socket_t *a_es, int a_remote_socket, struct sockaddr* a_remote_addr); static void s_es_server_error(dap_events_socket_t *a_es, int a_arg); static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg); -static void s_server_delete(dap_server_t * a_server); /** * @brief dap_server_init * @return @@ -86,15 +85,24 @@ void dap_server_deinit() * @brief dap_server_delete * @param a_server */ -void s_server_delete(dap_server_t * a_server) +void dap_server_delete(dap_server_t *a_server) { + while (a_server->es_listeners) { + dap_events_socket_t *l_es = (dap_events_socket_t *)a_server->es_listeners->data; + dap_events_socket_remove_and_delete_mt(l_es->worker, l_es); + dap_list_t *l_tmp = a_server->es_listeners; + a_server->es_listeners = l_tmp->next; + DAP_DELETE(l_tmp); + } if(a_server->delete_callback) a_server->delete_callback(a_server,NULL); - if( a_server->address ) - DAP_DELETE(a_server->address ); - if( a_server->_inheritor ) - DAP_DELETE( a_server->_inheritor ); - DAP_DELETE(a_server); + if( a_server->address ) + DAP_DELETE(a_server->address ); + if( a_server->_inheritor ) + DAP_DELETE( a_server->_inheritor ); + pthread_mutex_destroy(&a_server->started_mutex); + pthread_cond_destroy(&a_server->started_cond); + DAP_DELETE(a_server); } /** @@ -105,7 +113,7 @@ void s_server_delete(dap_server_t * a_server) * @param a_type * @return */ -dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16_t a_port, dap_server_type_t a_type) +dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16_t a_port, dap_server_type_t a_type, dap_events_socket_callbacks_t *a_callbacks) { assert(a_events); dap_server_t *l_server = DAP_NEW_Z(dap_server_t); @@ -117,6 +125,8 @@ dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16 if(l_server->type == DAP_SERVER_TCP) l_server->socket_listener = socket(AF_INET, SOCK_STREAM, 0); + else if (l_server->type == DAP_SERVER_UDP) + l_server->socket_listener = socket(AF_INET, SOCK_DGRAM, 0); if (l_server->socket_listener < 0) { int l_errno = errno; @@ -162,13 +172,20 @@ dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16 l_callbacks.accept_callback = s_es_server_accept; l_callbacks.error_callback = s_es_server_error; + if (a_callbacks) { + l_callbacks.read_callback = a_callbacks->read_callback; + l_callbacks.write_callback = a_callbacks->write_callback; + l_callbacks.error_callback = a_callbacks->error_callback; + } + for(size_t l_worker_id = 0; l_worker_id < dap_events_worker_get_count() ; l_worker_id++){ dap_worker_t *l_w = dap_events_worker_get(l_worker_id); assert(l_w); dap_events_socket_t * l_es = dap_events_socket_wrap2( l_server, a_events, l_server->socket_listener, &l_callbacks); + l_server->es_listeners = dap_list_append(l_server->es_listeners, l_es); - if ( l_es){ - l_es->type = DESCRIPTOR_TYPE_SOCKET_LISTENING; + if (l_es) { + l_es->type = l_server->type == DAP_SERVER_TCP ? DESCRIPTOR_TYPE_SOCKET_LISTENING : DESCRIPTOR_TYPE_SOCKET; #ifdef DAP_EVENTS_CAPS_EPOLL // Prepare for multi thread listening l_es->ev_base_flags = EPOLLET| EPOLLIN | EPOLLEXCLUSIVE; @@ -259,7 +276,6 @@ static dap_events_socket_t * s_es_server_create(dap_events_t * a_events, int a_s //fcntl(a_sock, F_SETFL, O_NONBLOCK); ret = dap_events_socket_wrap_no_add(a_events, a_sock, a_callbacks); - ret->is_dont_reset_write_flag = true; ret->type = DESCRIPTOR_TYPE_SOCKET; ret->server = a_server; diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index 6a2081799a..969ce8d232 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -27,6 +27,9 @@ #define _GNU_SOURCE /* See feature_test_macros(7) */ #endif #include <fcntl.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> #include "dap_common.h" #include "dap_math_ops.h" @@ -190,8 +193,15 @@ void *dap_worker_thread(void *arg) break; case DESCRIPTOR_TYPE_SOCKET: l_must_read_smth = true; - l_bytes_read = recv(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size), - sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0); + if (l_cur->server->type == DAP_SERVER_TCP) { + l_bytes_read = recv(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size), + sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0); + } else if (l_cur->server->type == DAP_SERVER_UDP) { + socklen_t l_size = sizeof(l_cur->remote_addr); + l_bytes_read = recvfrom(l_cur->fd, (char *) (l_cur->buf_in + l_cur->buf_in_size), + sizeof(l_cur->buf_in) - l_cur->buf_in_size, 0, + (struct sockaddr *)&l_cur->remote_addr, &l_size); + } l_errno = errno; break; case DESCRIPTOR_TYPE_SOCKET_LISTENING: @@ -208,6 +218,7 @@ void *dap_worker_thread(void *arg) char l_errbuf[128]; strerror_r(l_errno, l_errbuf, sizeof (l_errbuf)); log_it(L_WARNING,"accept() on socket %d error:\"%s\"(%d)",l_cur->socket, l_errbuf,l_errno); + break; } } @@ -244,7 +255,8 @@ void *dap_worker_thread(void *arg) continue; } }else{ - log_it(L_WARNING, "We have incomming %u data but no read callback on socket %d, removing from read set", l_cur->socket); + log_it(L_WARNING, "We have incomming %u data but no read callback on socket %d, removing from read set", + l_bytes_read, l_cur->socket); dap_events_socket_set_readable_unsafe(l_cur,false); } } @@ -299,8 +311,14 @@ void *dap_worker_thread(void *arg) int l_errno; switch (l_cur->type){ case DESCRIPTOR_TYPE_SOCKET: - l_bytes_sent = send(l_cur->socket, l_cur->buf_out, - l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL); + if (l_cur->server->type == DAP_SERVER_TCP) { + l_bytes_sent = send(l_cur->socket, (const char *)l_cur->buf_out, + l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL); + } else if (l_cur->server->type == DAP_SERVER_UDP) { + l_bytes_sent = sendto(l_cur->socket, (const char *)l_cur->buf_out, + l_cur->buf_out_size, MSG_DONTWAIT | MSG_NOSIGNAL, + (struct sockaddr *)&l_cur->remote_addr, sizeof(l_cur->remote_addr)); + } l_errno = errno; break; case DESCRIPTOR_TYPE_PIPE: diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h index 68020f1a33..bfbde1ad1d 100644 --- a/dap-sdk/net/core/include/dap_events_socket.h +++ b/dap-sdk/net/core/include/dap_events_socket.h @@ -144,11 +144,6 @@ typedef struct dap_events_socket { uint32_t buf_out_zero_count; - // Flags - bool is_pingable; - bool is_read_direct; // If set - don't call read() in worker, let operate with handler to callback - bool is_dont_reset_write_flag; // If set - don't reset write flag ever data is over - // Input section union{ uint8_t buf_in[DAP_EVENTS_SOCKET_BUF+1]; // Internal buffer for input data @@ -165,7 +160,7 @@ typedef struct dap_events_socket { // Stored string representation char hostaddr[1024]; // Address char service[128]; - struct sockaddr remote_addr; + struct sockaddr_in remote_addr; // For UDP datagrams // Links to related objects dap_events_t *events; diff --git a/dap-sdk/net/core/include/dap_server.h b/dap-sdk/net/core/include/dap_server.h index 44bf62135e..33e7c5ca43 100644 --- a/dap-sdk/net/core/include/dap_server.h +++ b/dap-sdk/net/core/include/dap_server.h @@ -48,10 +48,11 @@ #include "uthash.h" #include "utlist.h" +#include "dap_list.h" #include "dap_cpu_monitor.h" #include "dap_events_socket.h" -typedef enum dap_server_type {DAP_SERVER_TCP} dap_server_type_t; +typedef enum dap_server_type {DAP_SERVER_TCP, DAP_SERVER_UDP} dap_server_type_t; @@ -66,7 +67,7 @@ typedef struct dap_server { char *address; // Listen address int32_t socket_listener; // Socket for listener - dap_events_socket_t * es_listener; + dap_list_t *es_listeners; struct sockaddr_in listener_addr; // Kernel structure for listener's binded address @@ -85,4 +86,5 @@ typedef struct dap_server { int dap_server_init( ); // Init server module void dap_server_deinit( void ); // Deinit server module -dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16_t a_port, dap_server_type_t a_type); +dap_server_t* dap_server_new(dap_events_t *a_events, const char * a_addr, uint16_t a_port, dap_server_type_t a_type, dap_events_socket_callbacks_t *a_callbacks); +void dap_server_delete(dap_server_t *a_server); diff --git a/dap-sdk/net/server-udp/CMakeLists.txt b/dap-sdk/net/server-udp/CMakeLists.txt deleted file mode 100644 index f99bd6023d..0000000000 --- a/dap-sdk/net/server-udp/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 3.1) -project (dap_udp_server C) - - -file(GLOB DAP_UDP_SERVER_SRCS *.c) -file(GLOB DAP_UDP_SERVER_HEADERS include/*.h) - -if(WIN32) - include_directories(../../../3rdparty/wepoll/) - include_directories(../../../3rdparty/uthash/src/) - #include_directories(../3rdparty/curl/include/) -endif() - -add_library(${PROJECT_NAME} STATIC ${DAP_UDP_SERVER_SRCS} ${DAP_UDP_SERVER_HEADERS}) - -target_link_libraries(${PROJECT_NAME} dap_core dap_server_core) - -target_include_directories(${PROJECT_NAME} INTERFACE .) -target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/dap-sdk/net/server-udp/dap_udp_client.c b/dap-sdk/net/server-udp/dap_udp_client.c deleted file mode 100644 index fd4e86e809..0000000000 --- a/dap-sdk/net/server-udp/dap_udp_client.c +++ /dev/null @@ -1,185 +0,0 @@ -/* - Copyright (c) 2017-2019 (c) Project "DeM Labs Inc" https://demlabs.net - 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 <string.h> -#include <stdlib.h> -#include <stdio.h> -#include <stdarg.h> -#include <stdint.h> - -#ifndef _WIN32 -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/socket.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/select.h> -#include <sys/queue.h> -#include <errno.h> -#include <netdb.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/epoll.h> -#else -#include <winsock2.h> -#include <windows.h> -#include <mswsock.h> -#include <ws2tcpip.h> -#include <io.h> -#include <pthread.h> -#endif - -#include "uthash.h" -#include "utlist.h" - -#include "dap_common.h" -#include "dap_udp_client.h" -#include "dap_udp_server.h" - -#define LOG_TAG "udp_client" - -/** - * @brief get_key Make key for hash table from host and port - * @return 64 bit Key - */ -#define get_key( host, key ) (((uint64_t)host << 32) + (uint64_t)port) -extern bool sb_payload_ready; - -/** - * @brief udp_client_create Create new client and add it to hashmap - * @param sh Server instance - * @param host Client host address - * @param w_client Clients event loop watcher - * @param port Client port - * @return Pointer to the new list's node - */ -dap_events_socket_t *dap_udp_client_create( dap_server_t *dap_srv, EPOLL_HANDLE efd, unsigned long host, unsigned short port ) -{ - dap_udp_server_t *udp_server = DAP_UDP_SERVER( dap_srv ); - log_it( L_DEBUG, "Client structure create with host = %x, port = %d", host, port ); - - dap_udp_client_t *inh = DAP_NEW_Z( dap_udp_client_t ); - inh->host_key = get_key( host, port ); - - dap_events_socket_t *ret = dap_events_socket_wrap_no_add( dap_srv->es_listener->events, dap_srv->socket_listener, &dap_srv->client_callbacks); - inh->esocket = ret; - - ret->server = dap_srv; - - ret->flags = DAP_SOCK_READY_TO_READ; - -// ret->signal_close = false; -// ret->_ready_to_read = true; -// ret->_ready_to_write = false; - - ret->_inheritor = inh; - - pthread_mutex_init( &inh->mutex_on_client, NULL ); - - pthread_mutex_lock( &udp_server->mutex_on_list ); - HASH_ADD_INT( udp_server->hclients, host_key, inh ); - pthread_mutex_unlock( &udp_server->mutex_on_list ); - - if( dap_srv->client_callbacks.new_callback ) - dap_srv->client_callbacks.new_callback( ret, NULL ); // Init internal structure - - return ret; -} - -/** - * @brief udp_client_get_address Get host address and port of client - * @param client Pointer to client structure - * @param host Variable for host address - * @param host Variable for port - */ -void dap_udp_client_get_address( dap_events_socket_t *client, unsigned int* 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; -} - -/** - * @brief udp_client_find Find client structure by host address and port - * @param sh Server instance - * @param host Source host address - * @param port Source port - * @return Pointer to client or NULL if not found - */ -dap_events_socket_t *dap_udp_client_find( dap_server_t *dap_srv, unsigned long host, unsigned short port ) -{ - dap_udp_client_t *inh = NULL; - dap_udp_server_t *udp_server = DAP_UDP_SERVER( dap_srv ); - - uint64_t token = get_key( host, port ); - - pthread_mutex_lock( &udp_server->mutex_on_list ); - HASH_FIND_INT( udp_server->hclients, &token, inh ); - pthread_mutex_unlock( &udp_server->mutex_on_list ); - - if( inh == NULL ) - return NULL; - else - return inh->esocket; -} - -/** - * @brief add_waiting_client Add Client to write queue - * @param client Client instance - */ -void add_waiting_client( dap_events_socket_t *dap_rclient ) -{ - dap_udp_client_t* udp_cl, *tmp; - - dap_server_t *dap_srv = dap_rclient->server; - dap_udp_server_t *udp_server = DAP_UDP_SERVER( dap_srv ); - dap_udp_client_t *udp_client = DAP_UDP_CLIENT( dap_rclient ); - - pthread_mutex_lock( &udp_server->mutex_on_list ); - 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 ); -} - -size_t dap_udp_client_write_unsafe( dap_events_socket_t *dap_rclient, const void *data, size_t data_size ) -{ - size_t size = dap_events_socket_write_unsafe( dap_rclient, data, data_size ); - add_waiting_client( dap_rclient ); - return size; -} - -size_t dap_udp_client_write_f( dap_events_socket_t *dap_rclient, const char * a_format, ... ) -{ - size_t size = 0; - va_list va; - - va_start( va, a_format ); - size = dap_events_socket_write_f_unsafe( dap_rclient, a_format, va ); - va_end( va ); - - add_waiting_client( dap_rclient ); - return size; -} - diff --git a/dap-sdk/net/server-udp/dap_udp_server.c b/dap-sdk/net/server-udp/dap_udp_server.c deleted file mode 100644 index 26a0fc39bb..0000000000 --- a/dap-sdk/net/server-udp/dap_udp_server.c +++ /dev/null @@ -1,399 +0,0 @@ -/* - Copyright (c) 2017-2019 (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 <string.h> -#include <time.h> -#include <stdio.h> -#include <stdlib.h> -#include <stddef.h> -#include <signal.h> -#include <stdint.h> - -#ifndef _WIN32 -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/socket.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/select.h> -#include <sys/queue.h> -#include <errno.h> -#include <netdb.h> -#include <unistd.h> -#include <fcntl.h> -#include <sys/epoll.h> -#else -#include <winsock2.h> -#include <windows.h> -#include <mswsock.h> -#include <ws2tcpip.h> -#include <io.h> -#include <pthread.h> -#endif - -#include "uthash.h" -#include "utlist.h" - -#include "dap_common.h" -#include "dap_udp_server.h" - -#define LOG_TAG "dap_udp_server" - -#define BUFSIZE 1024 - -char buf[ BUFSIZE ]; /* message buf */ -bool sb_payload_ready; -//struct ev_io w_read; -//struct ev_io w_write; - -EPOLL_HANDLE efd_read = (EPOLL_HANDLE)-1; - -//static void write_cb( EPOLL_HANDLE efd, int revents ); - -int check_close( dap_events_socket_t *client ); - -/** - */ -static void error( char *msg ) { - - perror( msg ); - exit( 1 ); -} - -/** - * @brief dap_udp_server_new Initialize server structure - * @return Server pointer - */ -dap_server_t *dap_udp_server_new( ) -{ - 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; -} - -/** - * @brief dap_udp_server_delete Safe delete server structure - * @param sh Server instance - */ -void dap_udp_server_delete( dap_server_t *sh ) -{ - if ( !sh ) return; - -// dap_client_remote_t *client, *tmp; -// dap_udp_server_t *udps = (dap_udp_server_t *)sh->_inheritor; - -// if ( !udps ) return; - - if( sh->address ) - free( sh->address ); - -// HASH_ITER( hh, udps->hclients, client, tmp ) -// dap_client_remote_remove( client ); - - if ( sh->delete_callback ) - sh->delete_callback( sh, NULL ); - - if ( sh->_inheritor ) - free( sh->_inheritor ); - - free( sh ); -} - -/** - * @brief dap_udp_server_listen Create and bind server structure - * @param port Binding port - * @return Server instance - */ -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 ); - - if ( sh->socket_listener < 0 ) { - log_it ( L_ERROR, "Socket error %s", strerror(errno) ); - dap_udp_server_delete( sh ); - return NULL; - } - - int optval = 1; - if ( setsockopt( sh->socket_listener, SOL_SOCKET, SO_REUSEADDR, (const void *)&optval , sizeof(int)) < 0 ) - log_it( L_WARNING, "Can't set up REUSEADDR flag to the socket" ); - - memset( (char *)&(sh->listener_addr), 0, sizeof(sh->listener_addr) ); - - sh->listener_addr.sin_family = AF_INET; - sh->listener_addr.sin_addr.s_addr = htonl( INADDR_ANY ); - sh->listener_addr.sin_port = htons( port ); - - if ( bind(sh->socket_listener, (struct sockaddr *) &(sh->listener_addr), sizeof(sh->listener_addr)) < 0) { - log_it( L_ERROR, "Bind error: %s", strerror(errno) ); - dap_udp_server_delete( sh ); - return NULL; - } - log_it(L_INFO, "UDP server listening port 0.0.0.0:%d", port); - pthread_mutex_init( &DAP_UDP_SERVER(sh)->mutex_on_list, NULL ); - pthread_mutex_init( &DAP_UDP_SERVER(sh)->mutex_on_hash, NULL ); - - return sh; -} - -/** - * @brief write_cb - */ -static void write_cb( EPOLL_HANDLE efd, int revents, dap_server_t *sh ) -{ - UNUSED(revents); - dap_udp_client_t *udp_client, *tmp; - -// dap_server_t *sh = watcher->data; - dap_udp_server_t *udp = DAP_UDP_SERVER( sh ); - - 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_events_socket_t *client = udp_client->esocket; - - if( client != NULL && !check_close(client) && (client->flags & DAP_SOCK_READY_TO_WRITE) ) { - if ( client->buf_out_size > 0 ) { - struct sockaddr_in addr; - addr.sin_family = AF_INET; - dap_udp_client_get_address( client, (unsigned int *)&addr.sin_addr.s_addr, &addr.sin_port ); - //log_it(L_INFO,"write_cb_client host = %x, port = %d, socket = %x", addr.sin_addr.s_addr, addr.sin_port, sh->socket_listener); - for( size_t total_sent = 0; total_sent < client->buf_out_size; ) { - - int bytes_sent = sendto( sh->socket_listener, client->buf_out + total_sent, - client->buf_out_size - total_sent, 0, (struct sockaddr*) &addr, sizeof(addr) ); - - if ( bytes_sent < 0 ) { - log_it(L_ERROR,"Some error occured in send() function"); - break; - } - total_sent += bytes_sent; - } - client->buf_out_size = 0; - memset( client->buf_out, 0, sizeof(client->buf_out) ); - client->flags &= ~DAP_SOCK_READY_TO_WRITE; - sb_payload_ready = false; - } - LL_DELETE( udp->waiting_clients, udp_client ); - if ( sh->client_callbacks.write_callback ) - sh->client_callbacks.write_callback( client, NULL ); - } - else if( client == NULL ) { - LL_DELETE( udp->waiting_clients, udp_client ); - } - //pthread_mutex_unlock(&udp_client->mutex_on_client); - - } // for client - pthread_mutex_unlock(&udp->mutex_on_list); -} - -/** - * @brief check_close Check if client need to close - * @param client Client structure - * @return 1 if client deleted, 0 if client is no need to delete - */ -int check_close( dap_events_socket_t *client ) -{ - dap_udp_client_t *client_check, *tmp; - - if( !(client->flags & DAP_SOCK_SIGNAL_CLOSE) ) - return 0; - - 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 ); - - 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_events_socket_remove_and_delete_mt(client->worker, client ); - - return 1; -} - -/** - * @brief read_cb - */ -static void read_cb( EPOLL_HANDLE efd, int revents, dap_server_t *sh ) -{ - UNUSED(revents); -// if ( !(revents & EV_READ) ) return; - - struct sockaddr_in clientaddr; - socklen_t clientlen = sizeof(clientaddr); -// dap_server_t *sh = watcher->data; - - memset( buf, 0, BUFSIZE ); - - int32_t bytes = (int32_t) recvfrom( sh->socket_listener, buf, BUFSIZE, 0,(struct sockaddr *) &clientaddr, &clientlen ); - - dap_events_socket_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 ) { - - char *hostaddrp = inet_ntoa( clientaddr.sin_addr ); - - if ( hostaddrp == NULL ) { - dap_udp_server_delete( sh ); - error("ERROR on inet_ntoa\n"); - } - - if ( client == NULL ) { - client = dap_udp_client_create( sh, efd, clientaddr.sin_addr.s_addr, clientaddr.sin_port ); - if(client == NULL) { - dap_udp_server_delete( sh ); - 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 = bytes; - - while ( bytes_recieved > 0 ) { - - size_t bytes_to_transfer = 0; - - if ( bytes_recieved > UDP_CLIENT_BUF - client->buf_in_size ) - bytes_to_transfer = UDP_CLIENT_BUF - client->buf_in_size; - else - 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_callbacks.read_callback ) - sh->client_callbacks.read_callback( client, NULL ); - - bytes_processed += bytes_to_transfer; - bytes_recieved -= bytes_to_transfer; - } - - client->buf_in_size = 0; - memset( client->buf_in, 0, sizeof(client->buf_out) ); - - pthread_mutex_unlock( &udp_client->mutex_on_client ); - - } - else if ( bytes < 0 ) { - - log_it( L_ERROR, "Bytes read Error %s", strerror(errno) ); - if( client != NULL ) - client->flags |= DAP_SOCK_SIGNAL_CLOSE; - } - else if (bytes == 0) { - if ( client != NULL ) - client->flags |= DAP_SOCK_SIGNAL_CLOSE; - } -} - -/** - * @brief dap_udp_server_loop Start server event loop - * @param sh Server instance - */ -void dap_udp_server_loop( dap_server_t *d_server ) -{ - efd_read = epoll_create1( 0 ); - - if ( (intptr_t)efd_read == -1 ) { - - log_it( L_ERROR, "epoll_create1 failed" ); - goto udp_error; - } - - sb_payload_ready = false; - - struct epoll_event pev = {0, {0}}; - struct epoll_event events[ 16 ] = {{0, {0}}}; - - pev.events = EPOLLIN | EPOLLERR; - pev.data.fd = d_server->socket_listener; - - if ( epoll_ctl( efd_read, EPOLL_CTL_ADD, d_server->socket_listener, &pev) != 0 ) { - log_it( L_ERROR, "epoll_ctl failed 000" ); - goto udp_error; - } - - while( 1 ) { - - int32_t n = epoll_wait( efd_read, &events[0], 16, -1 ); - - if ( !n ) continue; - - if ( n < 0 ) { - if ( errno == EINTR ) - continue; - log_it( L_ERROR, "Server epoll error" ); - break; - } - - for( int32_t i = 0; i < n; ++ i ) { - - if ( events[i].events & EPOLLIN ) { - read_cb( efd_read, events[i].events, d_server ); - } - if ( events[i].events & EPOLLOUT) { - // Do nothing. It always true until socket eturn EAGAIN - } - if (sb_payload_ready) { - write_cb( efd_read, events[i].events, d_server ); - } - if( events[i].events & EPOLLERR ) { - log_it( L_ERROR, "Server socket error event" ); - goto udp_error; - } - } - - } - -udp_error: - - #ifndef _WIN32 - if ( efd_read != -1 ) - close( efd_read ); - #else - if ( efd_read != INVALID_HANDLE_VALUE ) - epoll_close( efd_read ); - #endif - - return; -} - diff --git a/dap-sdk/net/server-udp/include/dap_udp_client.h b/dap-sdk/net/server-udp/include/dap_udp_client.h deleted file mode 100644 index f1b3844f51..0000000000 --- a/dap-sdk/net/server-udp/include/dap_udp_client.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - 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/>. -*/ -#pragma once - -#include <stdint.h> -#include <stddef.h> -#include <stdbool.h> - -#ifndef WIN32 -#include <sys/queue.h> -#endif - -#include "dap_events_socket.h" -#include "dap_server.h" -#include "uthash.h" - -typedef struct dap_udp_server dap_udp_server_t; -struct dap_udp_client; - -#define UDP_CLIENT_BUF 65535 - -typedef struct dap_udp_client { - - dap_events_socket_t *esocket; - uint64_t host_key; //key contains host address in first 4 bytes and port in last 4 bytes - - 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) - -dap_events_socket_t *dap_udp_client_create( dap_server_t *sh, EPOLL_HANDLE efd, unsigned long host, unsigned short port ); // Create new client and add it to the list -dap_events_socket_t *dap_udp_client_find( dap_server_t *sh, unsigned long host, unsigned short port ); // Find client by host and port - -void dap_udp_client_ready_to_read( dap_events_socket_t *sc, bool is_ready ); -void dap_udp_client_ready_to_write( dap_events_socket_t *sc, bool is_ready ); - -size_t dap_udp_client_write_unsafe( dap_events_socket_t *sc, const void * data, size_t data_size ); -size_t dap_udp_client_write_f( dap_events_socket_t *a_client, const char * a_format, ... ); - -void add_waiting_client( dap_events_socket_t *client ); // Add client to writing queue - -void dap_udp_client_get_address( dap_events_socket_t *client, unsigned int *host, unsigned short *port ); diff --git a/dap-sdk/net/server-udp/include/dap_udp_server.h b/dap-sdk/net/server-udp/include/dap_udp_server.h deleted file mode 100644 index f1725b4d14..0000000000 --- a/dap-sdk/net/server-udp/include/dap_udp_server.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - Copyright (c) 2017-2019 (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/>. -*/ - -#pragma once - -#ifndef WIN32 - -#include <stdint.h> -#include <sys/socket.h> -#include <netdb.h> -#include <arpa/inet.h> -#include <netinet/in.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/select.h> -#include <sys/queue.h> -#define EPOLL_HANDLE int -#endif - -#include "dap_udp_client.h" -#include "dap_server.h" - -struct dap_udp_server; - -typedef struct dap_udp_thread { - pthread_t tid; -} dap_udp_thread_t; - -typedef void (*dap_udp_server_callback_t) (struct dap_udp_server *,void *arg); // Callback for specific server's operations - -typedef struct dap_udp_server { - - dap_udp_client_t *hclients; - dap_udp_client_t *waiting_clients; // List clients for writing data - pthread_mutex_t mutex_on_list; - pthread_mutex_t mutex_on_hash; - void *_inheritor; - dap_server_t *dap_server; - -} dap_udp_server_t; - -#define DAP_UDP_SERVER(a) ((dap_udp_server_t *) (a)->_inheritor) - -void dap_udp_server_delete( dap_server_t *sh ); -void dap_udp_server_loop( dap_server_t *udp_server ); // Start server event loop -dap_server_t *dap_udp_server_listen( uint16_t port ); // Create and bind serv diff --git a/dap-sdk/net/server-udp/test/CMakeLists.txt b/dap-sdk/net/server-udp/test/CMakeLists.txt deleted file mode 100644 index 998462efc7..0000000000 --- a/dap-sdk/net/server-udp/test/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -cmake_minimum_required(VERSION 3.0) -project(udp-server-test) - -set(CMAKE_C_STANDARD 11) - -if ( NOT ( TARGET dap_test ) ) - add_subdirectory(libdap-test) -endif() - -file(GLOB SRC *.h *.c) - -add_executable(${PROJECT_NAME} ${SRC}) - -target_link_libraries(${PROJECT_NAME} dap_test) - -add_test( - NAME udp-server-test - COMMAND udp-server-test -) - diff --git a/dap-sdk/net/server-udp/test/main.c b/dap-sdk/net/server-udp/test/main.c deleted file mode 100644 index e02c1ef950..0000000000 --- a/dap-sdk/net/server-udp/test/main.c +++ /dev/null @@ -1,5 +0,0 @@ -#include <stdio.h> -int main() -{ - return 0; -} diff --git a/dap-sdk/net/server/http_server/dap_http_simple.c b/dap-sdk/net/server/http_server/dap_http_simple.c index 9428a6f00d..0bc3b51be6 100644 --- a/dap-sdk/net/server/http_server/dap_http_simple.c +++ b/dap-sdk/net/server/http_server/dap_http_simple.c @@ -376,7 +376,6 @@ static void s_http_client_data_write( dap_http_client_t * a_http_client, void *a l_http_simple->reply_sent += dap_events_socket_write_unsafe( a_http_client->esocket, l_http_simple->reply_byte + l_http_simple->reply_sent, a_http_client->out_content_length - l_http_simple->reply_sent ); - dap_events_socket_set_writable_unsafe(a_http_client->esocket, true); if ( l_http_simple->reply_sent >= a_http_client->out_content_length ) { log_it(L_INFO, "All the reply (%u) is sent out", a_http_client->out_content_length ); diff --git a/dap-sdk/net/stream/ch/CMakeLists.txt b/dap-sdk/net/stream/ch/CMakeLists.txt index 657546fb9d..bf7b26a76f 100644 --- a/dap-sdk/net/stream/ch/CMakeLists.txt +++ b/dap-sdk/net/stream/ch/CMakeLists.txt @@ -11,7 +11,7 @@ endif() add_library(${PROJECT_NAME} STATIC ${DAP_STREAM_CH_SRCS} ${DAP_STREAM_CH_HDRS}) -target_link_libraries(dap_stream_ch dap_core dap_crypto dap_udp_server dap_stream ) +target_link_libraries(dap_stream_ch dap_core dap_crypto dap_stream ) target_include_directories(dap_stream_ch INTERFACE .) target_include_directories(${PROJECT_NAME} PUBLIC include) diff --git a/dap-sdk/net/stream/stream/CMakeLists.txt b/dap-sdk/net/stream/stream/CMakeLists.txt index 1b4ed0617c..60416f4523 100755 --- a/dap-sdk/net/stream/stream/CMakeLists.txt +++ b/dap-sdk/net/stream/stream/CMakeLists.txt @@ -12,7 +12,7 @@ endif() add_library(${PROJECT_NAME} STATIC ${STREAM_SRCS} ${STREAM_HDRS}) -target_link_libraries(dap_stream dap_core dap_server_core dap_udp_server dap_crypto +target_link_libraries(dap_stream dap_core dap_server_core dap_crypto dap_http_server dap_enc_server dap_session dap_stream_ch) target_include_directories(dap_stream INTERFACE .) diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index e9598cdf91..9904f8dac1 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -50,7 +50,6 @@ #include "dap_http.h" #include "dap_http_client.h" #include "dap_http_header.h" -#include "dap_udp_server.h" #include "dap_stream_worker.h" #define LOG_TAG "dap_stream" @@ -168,13 +167,12 @@ void dap_stream_add_proc_http(struct dap_http * a_http, const char * a_url) * @brief stream_add_proc_udp Add processor callback for streaming * @param a_udp_server UDP server instance */ -void dap_stream_add_proc_udp(dap_udp_server_t * a_udp_server) +void dap_stream_add_proc_udp(dap_server_t *a_udp_server) { - dap_server_t* l_server = a_udp_server->dap_server; - l_server->client_callbacks.read_callback = s_esocket_data_read; - l_server->client_callbacks.write_callback = s_esocket_write; - l_server->client_callbacks.delete_callback = s_esocket_callback_delete; - l_server->client_callbacks.new_callback = s_udp_esocket_new; + a_udp_server->client_callbacks.read_callback = s_esocket_data_read; + a_udp_server->client_callbacks.write_callback = s_esocket_write; + a_udp_server->client_callbacks.delete_callback = s_esocket_callback_delete; + a_udp_server->client_callbacks.new_callback = s_udp_esocket_new; } /** diff --git a/dap-sdk/net/stream/stream/dap_stream_pkt.c b/dap-sdk/net/stream/stream/dap_stream_pkt.c index 9642362c3c..13f3b4224d 100644 --- a/dap-sdk/net/stream/stream/dap_stream_pkt.c +++ b/dap-sdk/net/stream/stream/dap_stream_pkt.c @@ -152,7 +152,6 @@ size_t dap_stream_pkt_write_unsafe(dap_stream_t * a_stream, const void * a_data, ret+=dap_events_socket_write_unsafe(a_stream->esocket,&pkt_hdr,sizeof(pkt_hdr)); ret+=dap_events_socket_write_unsafe(a_stream->esocket,l_buf_selected,pkt_hdr.size); - dap_events_socket_set_writable_unsafe(a_stream->esocket, true); if(l_buf_allocated) DAP_DELETE(l_buf_allocated); diff --git a/dap-sdk/net/stream/stream/include/dap_stream.h b/dap-sdk/net/stream/stream/include/dap_stream.h index 0c0325bc30..71fb321518 100644 --- a/dap-sdk/net/stream/stream/include/dap_stream.h +++ b/dap-sdk/net/stream/stream/include/dap_stream.h @@ -32,8 +32,6 @@ #include "dap_stream_ch.h" #include "dap_events_socket.h" -#include "dap_udp_server.h" -#include "dap_udp_client.h" #define CHUNK_SIZE_MAX (3 * 1024) @@ -101,7 +99,7 @@ void dap_stream_deinit(); void dap_stream_add_proc_http(dap_http_t * sh, const char * url); -void dap_stream_add_proc_udp(dap_udp_server_t * sh); +void dap_stream_add_proc_udp(dap_server_t *a_udp_server); dap_stream_t* dap_stream_new_es_client(dap_events_socket_t * a_es); size_t dap_stream_data_proc_read(dap_stream_t * a_stream); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 586c36a59f..3130e4e291 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -38,6 +38,7 @@ #ifdef DAP_OS_UNIX #include <sys/types.h> #include <sys/socket.h> +#include <arpa/inet.h> #include <netdb.h> #endif @@ -422,9 +423,9 @@ static int s_net_states_proc(dap_chain_net_t * l_net) dap_chain_node_info_t *l_remote_node_info = dap_chain_node_info_read(l_net, l_remote_addr); if(l_remote_node_info) { dap_chain_node_info_t *l_link_node_info = DAP_NEW_Z(dap_chain_node_info_t); - int res = 0; //dap_dns_client_get_addr(l_remote_node_info->hdr.ext_addr_v4.s_addr, l_net->pub.name, l_link_node_info); - memcpy(l_link_node_info, l_remote_node_info, sizeof(dap_chain_node_info_t)); - if (l_link_node_info->hdr.address.uint64 != l_own_addr) { + int l_res = dap_dns_client_get_addr(l_remote_node_info->hdr.ext_addr_v4.s_addr, l_net->pub.name, l_link_node_info); + //memcpy(l_link_node_info, l_remote_node_info, sizeof(dap_chain_node_info_t)); + if (!l_res && l_link_node_info->hdr.address.uint64 != l_own_addr) { l_pvt_net->links_info = dap_list_append(l_pvt_net->links_info, l_link_node_info); } DAP_DELETE(l_remote_node_info); diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index 8ce67e110d..405fdedcdf 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -40,6 +40,7 @@ //#include <sys/select.h> #include <netinet/in.h> #include <sys/un.h> +#include <sys/stat.h> //#define closesocket close //typedef int SOCKET; //#define SOCKET_ERROR -1 // for win32 = (-1) diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index ce8848a5b7..a958642551 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -38,6 +38,10 @@ #include <ws2tcpip.h> #include <io.h> #include <pthread.h> +#else +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> #endif #include "dap_common.h" diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c index 67ab55b306..e21b1bc783 100644 --- a/modules/net/dap_chain_node_ping.c +++ b/modules/net/dap_chain_node_ping.c @@ -59,6 +59,9 @@ #include <wepoll.h> #else #include <signal.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> #endif #include <pthread.h> diff --git a/modules/net/dap_dns_server.c b/modules/net/dap_dns_server.c index 8c6907d31e..572ad8ffde 100644 --- a/modules/net/dap_dns_server.c +++ b/modules/net/dap_dns_server.c @@ -24,8 +24,6 @@ #include <errno.h> #include "dap_dns_server.h" -#include "dap_udp_server.h" -#include "dap_udp_client.h" #include "dap_events_socket.h" #include "dap_common.h" #include "dap_chain_net.h" @@ -38,6 +36,9 @@ #ifndef _WIN32 #include <unistd.h> // for close +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> #define closesocket close #define INVALID_SOCKET -1 #endif @@ -191,16 +192,16 @@ dap_dns_zone_callback_t dap_dns_zone_find(char *hostname) { * @param arg Unused * @return none */ -void dap_dns_client_read(dap_events_socket_t *client, void * arg) { - UNUSED(arg); - if (client->buf_in_size < DNS_HEADER_SIZE) { // Bad request +void dap_dns_client_read(dap_events_socket_t *a_es, void *a_arg) { + UNUSED(a_arg); + if (a_es->buf_in_size < DNS_HEADER_SIZE) { // Bad request return; } dap_dns_buf_t *dns_message = DAP_NEW(dap_dns_buf_t); dap_dns_buf_t *dns_reply = DAP_NEW(dap_dns_buf_t); - dns_message->data = DAP_NEW_SIZE(char, client->buf_in_size + 1); - dns_message->data[client->buf_in_size] = 0; - dap_events_socket_pop_from_buf_in(client, dns_message->data, client->buf_in_size); + dns_message->data = DAP_NEW_SIZE(char, a_es->buf_in_size + 1); + dns_message->data[a_es->buf_in_size] = 0; + dap_events_socket_pop_from_buf_in(a_es, dns_message->data, a_es->buf_in_size); dns_message->ptr = 0; // Parse incoming DNS message @@ -332,8 +333,7 @@ void dap_dns_client_read(dap_events_socket_t *client, void * arg) { dns_reply->data[2] = msg_flags.val >> 8; dns_reply->data[3] = msg_flags.val; // Send DNS reply - dap_events_socket_write_unsafe( client, dns_reply->data, dns_reply->ptr); - dap_events_socket_set_writable_unsafe( client, true); + dap_events_socket_write_unsafe(a_es, dns_reply->data, dns_reply->ptr); dap_string_free(dns_hostname, true); cleanup: DAP_DELETE(dns_reply->data); @@ -343,20 +343,16 @@ cleanup: return; } -void dap_dns_server_start() { - s_dns_server = DAP_NEW(dap_dns_server_t); - s_dns_server->hash_table = NULL; - s_dns_server->instance = dap_udp_server_listen(DNS_LISTEN_PORT); +void dap_dns_server_start(dap_events_t *a_ev) { + s_dns_server = DAP_NEW_Z(dap_dns_server_t); + dap_events_socket_callbacks_t l_cb = {}; + l_cb.read_callback = dap_dns_client_read; + s_dns_server->instance = dap_server_new(a_ev, NULL, DNS_LISTEN_PORT, DAP_SERVER_UDP, &l_cb); if (!s_dns_server->instance) { log_it(L_ERROR, "Can't start DNS server"); return; } - s_dns_server->instance->client_callbacks.read_callback = dap_dns_client_read; - s_dns_server->instance->client_callbacks.write_callback = NULL; - s_dns_server->instance->client_callbacks.new_callback = NULL; - s_dns_server->instance->client_callbacks.delete_callback = NULL; dap_dns_zone_register(&s_root_alias[0], dap_dns_resolve_hostname); // root resolver - pthread_create(&s_dns_server->udp_thread, NULL, (void *)dap_udp_server_loop, s_dns_server->instance); } void dap_dns_server_stop() { @@ -369,8 +365,7 @@ void dap_dns_server_stop() { DAP_DELETE(current_zone->zone); DAP_DELETE(current_zone); } - // TODO add code to stop udp_thread - dap_udp_server_delete(s_dns_server->instance); + dap_server_delete(s_dns_server->instance); DAP_DELETE(s_dns_server); } diff --git a/modules/net/include/dap_dns_server.h b/modules/net/include/dap_dns_server.h index e36022f8bf..75cdec7feb 100644 --- a/modules/net/include/dap_dns_server.h +++ b/modules/net/include/dap_dns_server.h @@ -116,11 +116,10 @@ typedef struct _dap_dns_zone_hash_t { typedef struct _dap_dns_server_t { dap_server_t *instance; - pthread_t udp_thread; dap_dns_zone_hash_t *hash_table; } dap_dns_server_t; -void dap_dns_server_start(); +void dap_dns_server_start(dap_events_t *a_ev); void dap_dns_server_stop(); int dap_dns_zone_register(char *zone, dap_dns_zone_callback_t callback); int dap_dns_zone_unregister(char *zone); diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index 35684d2e56..3ad8391109 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -35,6 +35,9 @@ #include <sys/ioctl.h> #include <sys/time.h> #include <sys/epoll.h> +#include <sys/types.h> +#include <sys/socket.h> +#include <arpa/inet.h> #include "dap_common.h" #include "dap_config.h" #include "dap_strfuncs.h" -- GitLab