diff --git a/src/Network/network_types.c b/src/Network/network_types.c index 856d2f6..875fe74 100644 --- a/src/Network/network_types.c +++ b/src/Network/network_types.c @@ -1,7 +1,11 @@ #include "network_types.h" -ktid_define(knIPV4Address); -ktid_define(knIPV4Endpoint); +char* __knIPV4Address_toString(void* p, u32 f){ return knIPV4Address_toString(p); } +char* __knIPV4Endpoint_toString(void* p, u32 f){ return knIPV4Endpoint_toString(p); } + +kt_define(knIPV4Address, NULL, __knIPV4Address_toString); +kt_define(knIPV4Endpoint, NULL, __knIPV4Endpoint_toString); + Maybe knIPV4Address_fromStr(char* addrStr){ char* addrStr_src=addrStr; diff --git a/src/Network/network_types.h b/src/Network/network_types.h index c0735a4..4a9d364 100644 --- a/src/Network/network_types.h +++ b/src/Network/network_types.h @@ -12,7 +12,7 @@ typedef union knIPV4Address { u32 UintBigEndian; char bytes[4]; } knIPV4Address; -ktid_declare(knIPV4Address); +kt_declare(knIPV4Address); #define knIPV4Address_fromBytes(A, B, C, D) ((knIPV4Address){.bytes={A,B,C,D}}) #define knIPV4Address_fromU32(N) ((knIPV4Address){.UintBigEndian=N}) @@ -27,11 +27,10 @@ Maybe knIPV4Address_fromStr(char* addrStr); char* knIPV4Address_toString(knIPV4Address* address); -typedef struct knIPV4Endpoint { +STRUCT(knIPV4Endpoint, knIPV4Address address; knPort port; -} knIPV4Endpoint; -ktid_declare(knIPV4Endpoint); +) #define knIPV4Endpoint_create(ADDR, PORT) ((knIPV4Endpoint){ADDR, PORT}) diff --git a/src/Network/sockets/knSocketChanneled.c b/src/Network/sockets/knSocketChanneled.c index 77e55da..26106a6 100644 --- a/src/Network/sockets/knSocketChanneled.c +++ b/src/Network/sockets/knSocketChanneled.c @@ -1,9 +1,11 @@ #include "../network_internal.h" -ktid_define(knPackage); -ktid_define(knPackageQueueElem); -ktid_define(knChannel); -ktid_define(knSocketChanneled); +void __knSocketChanneled_close(void* p){ knSocketChanneled_close(p); } + +kt_define(knPackage, NULL, NULL); +kt_define(knPackageQueueElem, NULL, NULL); +kt_define(knChannel, NULL, NULL); +kt_define(knSocketChanneled, __knSocketChanneled_close, NULL); Maybe knSocketChanneled_open(){ knSocketChanneled* newSocket=malloc(sizeof(knSocketChanneled)); @@ -15,17 +17,9 @@ Maybe knSocketChanneled_open(){ } Maybe knSocketChanneled_close(knSocketChanneled* socket){ - int result= -#if KN_USE_WINSOCK - closesocket -#else - close -#endif - (socket->socketfd); - if(result==-1) { - safethrow("can't close socket",;); - } - else return MaybeNull; + try(__kn_StdSocket_close(socket->socketfd), _m762, ;); + free(socket); + return MaybeNull; } knChannel* __createChannel(){ diff --git a/src/Network/sockets/knSocketChanneled.h b/src/Network/sockets/knSocketChanneled.h index a0e00e7..9cd44a8 100644 --- a/src/Network/sockets/knSocketChanneled.h +++ b/src/Network/sockets/knSocketChanneled.h @@ -1,83 +1,77 @@ -#pragma once - -#if __cplusplus -extern "C" { -#endif - -#include "../network_types.h" - -#define KNPAC_MAX_DATA_SIZE (65535-sizeof(knPackage)+sizeof(u8*)) - - -typedef enum __attribute__((__packed__)) knPacVersion { - knPac_V1=1 -} knPacVersion; - -static const char knPacHeader[5]={'k','n','p','a','c'}; - -typedef struct knPackage { - char header[5]; // knpac - knPacVersion version; // protocol version - u16 data_size; // size of data block in bytes (1-KNPAC_MAX_DATA_SIZE) - u32 channel_id; // id of knChannel in socket - u32 package_num; // number in sequence of sent packages - u64 data_hash; // hash64 of data - u8* data; // ptr to data -} knPackage; -ktid_declare(knPackage); - -typedef struct knPackageQueueElem knPackageQueueElem; -struct knPackageQueueElem { - knPackage package; - knPackageQueueElem* previousElem; - knPackageQueueElem* nextElem; -}; -ktid_declare(knPackageQueueElem); - -typedef struct knChannel { - knPackageQueueElem* queueStart; -} knChannel; -ktid_declare(knChannel); - -typedef struct knSocketChanneled{ - i64 socketfd; - knIPV4Endpoint localEndpoint; - knIPV4Endpoint remoteEndpoint; - u16 channelsAmount; - knChannel** channels; -} knSocketChanneled; -ktid_declare(knSocketChanneled); - - -///@return Maybe new socket -Maybe knSocketChanneled_open(); - -///@return Maybe error or nothing -Maybe knSocketChanneled_close(knSocketChanneled* socket); - -///@return Maybe channel index -Maybe knSocketChanneled_createChannel(knSocketChanneled* socket); - -///start listening at local endpoint -///@return Maybe error or nothing -Maybe knSocketChanneled_listen(knSocketChanneled* socket, knIPV4Endpoint localEndp); - -///sets socket remote endpoint -///@return Maybe error or nothing -Maybe knSocketChanneled_connect(knSocketChanneled* socket, knIPV4Endpoint remoteEndp); - -///@return Maybe new socket connected to client -Maybe knSocketChanneled_accept(knSocketChanneled* socket); - -///@param dataLength 0-4294967295 -///@return Maybe -Maybe knSocketChanneled_send(knSocketChanneled* socket, u16 destinationIndex, u8* data, u32 dataLength); - -///@param buffer buffer for receiving data -///@param bufferLength 0-4294967295 -///@return Maybe received bytes amount -Maybe knSocketChanneled_receive(knSocketChanneled* socket, u16 destinationIndex, u8* buffer, u32 bufferLength); - -#if __cplusplus -} +#pragma once + +#if __cplusplus +extern "C" { +#endif + +#include "../network_types.h" + +#define KNPAC_MAX_DATA_SIZE (65535-sizeof(knPackage)+sizeof(u8*)) + + +typedef enum __attribute__((__packed__)) knPacVersion { + knPac_V1=1 +} knPacVersion; + +static const char knPacHeader[5]={'k','n','p','a','c'}; + +STRUCT(knPackage, + char header[5]; /* knpac */ + knPacVersion version; /* protocol version */ + u16 data_size; /* size of data block in bytes (1-KNPAC_MAX_DATA_SIZE) */ + u32 channel_id; /* id of knChannel in socket */ + u32 package_num; /* number in sequence of sent packages */ + u64 data_hash; /* hash64 of data */ + u8* data; /* ptr to data */ +) + +STRUCT(knPackageQueueElem, + knPackage package; + knPackageQueueElem* previousElem; + knPackageQueueElem* nextElem; +) + +STRUCT(knChannel, + knPackageQueueElem* queueStart; +) + +STRUCT(knSocketChanneled, + i64 socketfd; + knIPV4Endpoint localEndpoint; + knIPV4Endpoint remoteEndpoint; + u16 channelsAmount; + knChannel** channels; +) + +///@return Maybe new socket +Maybe knSocketChanneled_open(); + +///@return Maybe error or nothing +Maybe knSocketChanneled_close(knSocketChanneled* socket); + +///@return Maybe channel index +Maybe knSocketChanneled_createChannel(knSocketChanneled* socket); + +///start listening at local endpoint +///@return Maybe error or nothing +Maybe knSocketChanneled_listen(knSocketChanneled* socket, knIPV4Endpoint localEndp); + +///sets socket remote endpoint +///@return Maybe error or nothing +Maybe knSocketChanneled_connect(knSocketChanneled* socket, knIPV4Endpoint remoteEndp); + +///@return Maybe new socket connected to client +Maybe knSocketChanneled_accept(knSocketChanneled* socket); + +///@param dataLength 0-4294967295 +///@return Maybe +Maybe knSocketChanneled_send(knSocketChanneled* socket, u16 destinationIndex, u8* data, u32 dataLength); + +///@param buffer buffer for receiving data +///@param bufferLength 0-4294967295 +///@return Maybe received bytes amount +Maybe knSocketChanneled_receive(knSocketChanneled* socket, u16 destinationIndex, u8* buffer, u32 bufferLength); + +#if __cplusplus +} #endif \ No newline at end of file diff --git a/src/Network/sockets/knSocketTCP.c b/src/Network/sockets/knSocketTCP.c index 43c12fe..42b079e 100644 --- a/src/Network/sockets/knSocketTCP.c +++ b/src/Network/sockets/knSocketTCP.c @@ -1,6 +1,8 @@ #include "../network_internal.h" -ktid_define(knSocketTCP); +void __knSocketTCP_close(void* p){ knSocketTCP_close(p); } + +kt_define(knSocketTCP, __knSocketTCP_close, NULL); Maybe knSocketTCP_open(bool allowReuse){ knSocketTCP* newSocket=malloc(sizeof(knSocketTCP)); diff --git a/src/Network/sockets/knSocketTCP.h b/src/Network/sockets/knSocketTCP.h index 3f28134..6cc4072 100644 --- a/src/Network/sockets/knSocketTCP.h +++ b/src/Network/sockets/knSocketTCP.h @@ -6,13 +6,12 @@ extern "C" { #include "../network_types.h" -typedef struct knSocketTCP { +STRUCT(knSocketTCP, i64 socketfd; knIPV4Endpoint localEndpoint; knIPV4Endpoint remoteEndpoint; - // TODO socket status enum -} knSocketTCP; -ktid_declare(knSocketTCP); + /* TODO socket status enum */ +) ///@note EXAMPLE 1: socket = open(false); bind(socket, localhost:8080); close(socket); - the socket on port 8080 still unavaliable for several minutes ///@note EXAMPLE 2: socket = open(true); bind(socket, localhost:8080); close(socket); - the socket on port 8080 can be opened again diff --git a/src/Network/sockets/knSocketUDP.c b/src/Network/sockets/knSocketUDP.c index 7a50c47..b1c429e 100644 --- a/src/Network/sockets/knSocketUDP.c +++ b/src/Network/sockets/knSocketUDP.c @@ -1,6 +1,8 @@ #include "../network_internal.h" -ktid_define(knSocketUDP); +void __knSocketUDP_close(void* p){ knSocketUDP_close(p); } + +kt_define(knSocketUDP, __knSocketUDP_close, NULL); Maybe knSocketUDP_open(bool allowReuse){ knSocketUDP* newSocket=malloc(sizeof(knSocketUDP)); diff --git a/src/Network/sockets/knSocketUDP.h b/src/Network/sockets/knSocketUDP.h index 658ee50..f523c8b 100644 --- a/src/Network/sockets/knSocketUDP.h +++ b/src/Network/sockets/knSocketUDP.h @@ -6,12 +6,11 @@ extern "C" { #include "../network_types.h" -typedef struct knSocketUDP { +STRUCT(knSocketUDP, i64 socketfd; knIPV4Endpoint localEndpoint; - // TODO socket status enum -} knSocketUDP; -ktid_declare(knSocketUDP); + /* TODO socket status enum */ +) ///@note EXAMPLE 1: socket = open(false); bind(socket, localhost:8080); close(socket); - the socket on port 8080 still unavaliable for several minutes ///@note EXAMPLE 2: socket = open(true); bind(socket, localhost:8080); close(socket); - the socket on port 8080 can be opened again diff --git a/src/base/type_system/init.c b/src/base/type_system/init.c index 424b759..240aabf 100644 --- a/src/base/type_system/init.c +++ b/src/base/type_system/init.c @@ -1,87 +1,95 @@ -#include "../base.h" -#include "../../Array/Array.h" -#include "../../Autoarr/Autoarr.h" -#include "../../SearchTree/SearchTree.h" -#include "../../Hashtable/Hashtable.h" -#include "../../String/StringBuilder.h" -#include "../../Filesystem/filesystem.h" -#include "base_toString.h" - -void kt_initKerepTypes(){ - // base types - kt_register(Pointer); - if(ktid_Pointer!=0) // this can break UnitypeNull - throw("ktid_Pointer!=0, you must init kerep types before any other types"); - - kt_register(char); - kt_register(bool); - kt_register(f32); - kt_register(f64); - kt_register(i8); - kt_register(u8); - kt_register(i16); - kt_register(u16); - kt_register(i32); - kt_register(u32); - kt_register(i64); - kt_register(u64); - - // ktDescriptor - kt_register(ktDescriptor); - - // base type arrays - kt_register(Array_char); - kt_register(Array_bool); - kt_register(Array_f32); - kt_register(Array_f64); - kt_register(Array_i8); - kt_register(Array_u8); - kt_register(Array_i16); - kt_register(Array_u16); - kt_register(Array_i32); - kt_register(Array_u32); - kt_register(Array_i64); - kt_register(Array_u64); - kt_register(Array_Pointer); - - // base type autoarrs - kt_register(Autoarr_Pointer); - kt_register(Autoarr_char); - kt_register(Autoarr_bool); - kt_register(Autoarr_f32); - kt_register(Autoarr_f64); - kt_register(Autoarr_i8); - kt_register(Autoarr_u8); - kt_register(Autoarr_i16); - kt_register(Autoarr_u16); - kt_register(Autoarr_i32); - kt_register(Autoarr_u32); - kt_register(Autoarr_i64); - kt_register(Autoarr_u64); - - // Unitype - kt_register(Unitype); - kt_register(Array_Unitype); - kt_register(Autoarr_Unitype); - - // STNode - kt_register(STNode); - - // KeyValuePair - kt_register(KVPair); - kt_register(Autoarr_KVPair); - - // Hashtable - kt_register(Hashtable); - - // string - kt_register(string); - kt_register(Array_string); - kt_register(Autoarr_string); - - // StringBuilder - kt_register(StringBuilder); - - //File - kt_register(FileHandle); -} +#include "../base.h" +#include "../../Array/Array.h" +#include "../../Autoarr/Autoarr.h" +#include "../../SearchTree/SearchTree.h" +#include "../../Hashtable/Hashtable.h" +#include "../../String/StringBuilder.h" +#include "../../Filesystem/filesystem.h" +#include "../../Network/network.h" +#include "base_toString.h" + +void kt_initKerepTypes(){ + // base types + kt_register(Pointer); + if(ktid_Pointer!=0) // this can break UnitypeNull + throw("ktid_Pointer!=0, you must init kerep types before any other types"); + + kt_register(char); + kt_register(bool); + kt_register(f32); + kt_register(f64); + kt_register(i8); + kt_register(u8); + kt_register(i16); + kt_register(u16); + kt_register(i32); + kt_register(u32); + kt_register(i64); + kt_register(u64); + + // ktDescriptor + kt_register(ktDescriptor); + + // base type arrays + kt_register(Array_char); + kt_register(Array_bool); + kt_register(Array_f32); + kt_register(Array_f64); + kt_register(Array_i8); + kt_register(Array_u8); + kt_register(Array_i16); + kt_register(Array_u16); + kt_register(Array_i32); + kt_register(Array_u32); + kt_register(Array_i64); + kt_register(Array_u64); + kt_register(Array_Pointer); + + // base type autoarrs + kt_register(Autoarr_Pointer); + kt_register(Autoarr_char); + kt_register(Autoarr_bool); + kt_register(Autoarr_f32); + kt_register(Autoarr_f64); + kt_register(Autoarr_i8); + kt_register(Autoarr_u8); + kt_register(Autoarr_i16); + kt_register(Autoarr_u16); + kt_register(Autoarr_i32); + kt_register(Autoarr_u32); + kt_register(Autoarr_i64); + kt_register(Autoarr_u64); + + // Unitype + kt_register(Unitype); + kt_register(Array_Unitype); + kt_register(Autoarr_Unitype); + + // STNode + kt_register(STNode); + + // KeyValuePair + kt_register(KVPair); + kt_register(Autoarr_KVPair); + + // Hashtable + kt_register(Hashtable); + + // string + kt_register(string); + kt_register(Array_string); + kt_register(Autoarr_string); + + // StringBuilder + kt_register(StringBuilder); + + // File + kt_register(FileHandle); + + // Network + kt_register(knIPV4Address); + kt_register(knIPV4Endpoint); + kt_register(knSocketTCP); + kt_register(knSocketUDP); + kt_register(knSocketChanneled); +} diff --git a/tests/main.cpp b/tests/main.cpp index b627772..7623ef9 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -6,8 +6,7 @@ i32 main(){ kt_beginInit(); kt_initKerepTypes(); kt_endInit(); - // test_all(); - test_network(); + test_all(); kt_free(); kprintf("\e[37m\n"); return 0;