From 65f63bf6a894e1b1eb482e69672f3c2ba8614bbf Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Thu, 11 Apr 2024 07:46:40 +0500 Subject: [PATCH] listener upd --- cbuild | 2 +- kerep | 2 +- src/ListenerTCP.c | 60 +++++++++++++++++++++++++++ src/ListenerUDP.c | 18 ++++++++ src/Listeners.c | 103 ---------------------------------------------- src/port-tunnel.h | 24 +---------- src/time.c | 38 ----------------- 7 files changed, 81 insertions(+), 166 deletions(-) create mode 100644 src/ListenerTCP.c create mode 100644 src/ListenerUDP.c delete mode 100644 src/Listeners.c delete mode 100644 src/time.c diff --git a/cbuild b/cbuild index c20e1e8..574ce6e 160000 --- a/cbuild +++ b/cbuild @@ -1 +1 @@ -Subproject commit c20e1e8f1c3e92e7f980a74942352b0a3744edcd +Subproject commit 574ce6eab3b65e05888adad95a0211f532dd1125 diff --git a/kerep b/kerep index 95a9fcf..f2847a8 160000 --- a/kerep +++ b/kerep @@ -1 +1 @@ -Subproject commit 95a9fcfd5e7bbe14962156a4fa4eb8d686fc4c13 +Subproject commit f2847a819d8271306cea8a841bb4b47aa36a8d73 diff --git a/src/ListenerTCP.c b/src/ListenerTCP.c new file mode 100644 index 0000000..3d25c6f --- /dev/null +++ b/src/ListenerTCP.c @@ -0,0 +1,60 @@ +#include "port-tunnel.h" + +void ListenerTCP_construct(ListenerTCP* ptr, knIPV4Endpoint listener_end){ + __PipeStorage_construct(&ptr->pipes); + tryLast(knSocketTCP_open(true), m_s, ;); + ptr->main_sock = m_s.value.VoidPtr; + tryLast(knSocketTCP_bindAndListen(ptr->main_sock, listener_end), _m7u7, ;); + ptr->connector_end = knIPV4Endpoint_INVALID; +} + +void ListenerTCP_destruct(ListenerTCP* ptr){ + __PipeStorage_destruct(&ptr->pipes); + tryLast(knSocketTCP_close(ptr->main_sock), _m864, ;); +} + + +Maybe ListenerTCP_accept(ListenerTCP* ptr, knSocketTCP** connection_socket){ + char buf[65535]; + const u32 bufsize = sizeof(buf); + InternalPacket internal_pac; + IncomingPacket incoming_pac; + OutgoingPacket outgoing_pac; + try(knSocketTCP_accept(ptr->main_sock), m_cs, ;); + *connection_socket = m_cs.value.VoidPtr; + + try(knSocketTCP_receiveN(*connection_socket, buf, bufsize, sizeof(InternalPacket)), _m876, ;) + + if(!InternalPacket_tryParse(buf, bufsize, &internal_pac)) + safethrow("ListenerTCP received unexpected message", ;); + if(internal_pac.message != InternalPacketMessage_ConnectorHandshake){ + char errmsg[256]; + ksprintf(errmsg, sizeof(errmsg), "received InternalPacket with invalid data: %lu", internal_pac.message); + safethrow(errmsg, ;) + } + internal_pac.data.U64 = InternalPacketMessage_ListenerHandshake; + try(knSocketTCP_send(*connection_socket, (void*)&internal_pac, sizeof(internal_pac)), _m865, ;) + + while(true){ + + } +} + +void ListenerTCP_start(ListenerTCP* ptr){ + u32 connection_n = 0; + while(true) { + char logCtx[64]; + ksprintf(logCtx, sizeof(logCtx), "ListenerTCP/%u", connection_n++); + knSocketTCP* connection_socket = NULL; + Maybe m = ListenerTCP_accept(ptr, &connection_socket); + if(m.errmsg){ + logExceptionAsWarning(logCtx, m); + m = knSocketTCP_shutdown(connection_socket, knShutdownType_Both); + if(m.errmsg) + logExceptionAsError(logCtx, m); + m = knSocketTCP_close(connection_socket); + if(m.errmsg) + logExceptionAsError(logCtx, m); + } + } +} diff --git a/src/ListenerUDP.c b/src/ListenerUDP.c new file mode 100644 index 0000000..170bd90 --- /dev/null +++ b/src/ListenerUDP.c @@ -0,0 +1,18 @@ +#include "port-tunnel.h" + +void ListenerUDP_construct(ListenerUDP* ptr, knIPV4Endpoint listener_end){ + __PipeStorage_construct(&ptr->pipes); + tryLast(knSocketUDP_open(true), m_s, ;); + ptr->main_sock = m_s.value.VoidPtr; + tryLast(knSocketUDP_bind(ptr->main_sock, listener_end), _m7u7, ;); + ptr->connector_end = knIPV4Endpoint_INVALID; +} + +void ListenerUDP_destruct(ListenerUDP* ptr){ + __PipeStorage_destruct(&ptr->pipes); + tryLast(knSocketUDP_close(ptr->main_sock), _m864, ;); +} + +void ListenerUDP_start(ListenerUDP* ptr){ + +} diff --git a/src/Listeners.c b/src/Listeners.c deleted file mode 100644 index c475189..0000000 --- a/src/Listeners.c +++ /dev/null @@ -1,103 +0,0 @@ -#include "port-tunnel.h" - -//////////////////////////////////////// -// ListenerUDP // -//////////////////////////////////////// - -void ListenerUDP_construct(ListenerUDP* ptr, knIPV4Endpoint listener_end){ - __PipeStorage_construct(&ptr->pipes); - tryLast(knSocketUDP_open(true), m_s, ;); - ptr->main_sock = m_s.value.VoidPtr; - tryLast(knSocketUDP_bind(ptr->main_sock, listener_end), _m7u7, ;); - ptr->connector_end = knIPV4Endpoint_INVALID; -} - -void ListenerUDP_destruct(ListenerUDP* ptr){ - __PipeStorage_destruct(&ptr->pipes); - tryLast(knSocketUDP_close(ptr->main_sock), _m864, ;); -} - -void ListenerUDP_start(ListenerUDP* ptr){ - -} - -//////////////////////////////////////// -// ListenerTCP // -//////////////////////////////////////// - -void ListenerTCP_construct(ListenerTCP* ptr, knIPV4Endpoint listener_end){ - __PipeStorage_construct(&ptr->pipes); - tryLast(knSocketTCP_open(true), m_s, ;); - ptr->main_sock = m_s.value.VoidPtr; - tryLast(knSocketTCP_bindAndListen(ptr->main_sock, listener_end), _m7u7, ;); - ptr->connector_end = knIPV4Endpoint_INVALID; -} - -void ListenerTCP_destruct(ListenerTCP* ptr){ - __PipeStorage_destruct(&ptr->pipes); - tryLast(knSocketTCP_close(ptr->main_sock), _m864, ;); -} - -/// receives data while receivedCount < N -///@return Maybe -Maybe knSocketTCP_receiveN(knSocketTCP* socket, char* buf, u32 bufsize, u32 n){ - if(bufsize < n) - safethrow(ERR_UNEXPECTEDVAL, ;); - - u32 receivedTotal = 0; - while(receivedTotal < n) { - try(knSocketTCP_receive(socket, buf, n-receivedTotal), m_receivedCount, ;); - receivedTotal += m_receivedCount.value.UInt64; - } - return MaybeNull; -} - -void ListenerTCP_start(ListenerTCP* ptr){ - const char logCtx[] = "ListenerTCP"; - char buf[65535]; - const u32 bufsize = sizeof(buf); - InternalPacket internal_pac; - IncomingPacket incoming_pac; - OutgoingPacket outgoing_pac; - int connection_n = 0; - while(true) { - Maybe m = knSocketTCP_accept(ptr->main_sock); - if(m.errmsg){ - logExceptionAsWarning(logCtx, m); - continue; - } - knSocketTCP* connection_socket = m.value.VoidPtr; - - m = knSocketTCP_receiveN(connection_socket, buf, bufsize, sizeof(InternalPacket)); - if(m.errmsg){ - logExceptionAsWarning(logCtx, m); - m = knSocketTCP_shutdown(connection_socket, knShutdownType_Both); - if(m.errmsg) - logExceptionAsWarning(logCtx, m); - m = knSocketTCP_close(connection_socket); - if(m.errmsg) - logExceptionAsWarning(logCtx, m); - continue; - } - if(!InternalPacket_tryParse(buf, bufsize, &internal_pac)){ - logInfo(logCtx, "ListenerTCP received something unexpected"); - m = knSocketTCP_shutdown(connection_socket, knShutdownType_Both); - if(m.errmsg) - logExceptionAsWarning(logCtx, m); - m = knSocketTCP_close(connection_socket); - if(m.errmsg) - logExceptionAsWarning(logCtx, m); - continue; - } - if(internal_pac.data.U64 != InternalPacketMessage_ConnectorHandshake){ - logInfo(logCtx, "received InternalPacket with invalid data: %lu", internal_pac.data); - } - - int attemptN = 0; - while(attemptN < 20){ - // do pipes here - } - logWarning(logCtx, "connector is unreachable"); - } - sleepMsec(500); -} diff --git a/src/port-tunnel.h b/src/port-tunnel.h index 687a4f4..098b901 100644 --- a/src/port-tunnel.h +++ b/src/port-tunnel.h @@ -7,33 +7,11 @@ extern "C" { #include #include "../kerep/src/Network/network.h" #include "../kerep/src/Hashtable/Hashtable.h" +#include "../kerep/src/time/time.h" /// defined in help_message.c extern const char* help_message; -//////////////////////////////////////// -// Time // -//////////////////////////////////////// - -/// nanoseconds -typedef u64 nsec_t; -/// microseconds -typedef u64 usec_t; -/// miliseconds -typedef u64 msec_t; - -/// system time now in nanoseconds -///@return u64 will overflow in 13 years -nsec_t getTimeNsec(); - -/// system time now in microseconds -///@return u64 will overflow in 58494 years -usec_t getTimeUsec(); - -void sleepNsec(nsec_t time); -void sleepUsec(usec_t time); -void sleepMsec(msec_t time); - //////////////////////////////////////// // Enums // //////////////////////////////////////// diff --git a/src/time.c b/src/time.c deleted file mode 100644 index 588e4c3..0000000 --- a/src/time.c +++ /dev/null @@ -1,38 +0,0 @@ -#include "port-tunnel.h" - -#define K 1000 -#define M 1000000 -#define G 1000000000 - -nsec_t getTimeNsec(){ - struct timespec t; - if(clock_gettime(CLOCK_REALTIME, &t) != 0) - throw(ERR_UNEXPECTEDVAL); - u64 n = t.tv_sec * G + t.tv_nsec; - return n; -} - -usec_t getTimeUsec(){ - struct timespec t; - if(clock_gettime(CLOCK_REALTIME, &t) != 0) - throw(ERR_UNEXPECTEDVAL); - u64 n = t.tv_sec * M + t.tv_nsec / K; - return n; -} - -void sleepNsec(nsec_t time){ - struct timespec t = { - .tv_sec = time / G, - .tv_nsec = time % G - }; - if(nanosleep(&t, NULL) != 0) - logDebug("nanosleep failed"); -} - -void sleepUsec(usec_t time){ - sleepNsec(time * K); -} - -void sleepMsec(msec_t time){ - sleepNsec(time * M); -}