From 6d5b9e3ab9b382e55a232f5c28b918bf82dcfedd Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:16:39 -0600 Subject: [PATCH 01/10] update test cases --- code/tests/cases/test_network.c | 203 ++++++++++++++- code/tests/cases/test_network.cpp | 409 +++++++++++++++++++++++++++++- 2 files changed, 599 insertions(+), 13 deletions(-) diff --git a/code/tests/cases/test_network.c b/code/tests/cases/test_network.c index ea4405d..e3d508e 100644 --- a/code/tests/cases/test_network.c +++ b/code/tests/cases/test_network.c @@ -51,7 +51,7 @@ FOSSIL_TEST_CASE(c_test_network_init) { FOSSIL_TEST_CASE(c_test_network_create_socket) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil_io_network_close(sock); fossil_io_network_destroy(); @@ -59,7 +59,7 @@ FOSSIL_TEST_CASE(c_test_network_create_socket) { FOSSIL_TEST_CASE(c_test_network_bind) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); int result = fossil_io_network_bind(sock, "127.0.0.1", 8080); ASSUME_ITS_EQUAL_I32(0, result); @@ -69,7 +69,7 @@ FOSSIL_TEST_CASE(c_test_network_bind) { FOSSIL_TEST_CASE(c_test_network_listen) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil_io_network_bind(sock, "127.0.0.1", 8080); int result = fossil_io_network_listen(sock, 5); @@ -80,13 +80,192 @@ FOSSIL_TEST_CASE(c_test_network_listen) { FOSSIL_TEST_CASE(c_test_network_close) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil_io_network_close(sock); // No direct way to test close, but we assume no errors if it reaches here fossil_io_network_destroy(); } +FOSSIL_TEST_CASE(c_test_network_create_udp_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_bind_udp) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8081); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_sendto_udp) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, UDP!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8081); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_recvfrom_udp) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8081); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_create_raw_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_create_rdm_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_create_seqpacket_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_bind_raw) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8082); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_bind_rdm) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8083); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_bind_seqpacket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8084); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_sendto_raw) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, RAW!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8082); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_sendto_rdm) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, RDM!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8083); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_sendto_seqpacket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, SEQPACKET!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8084); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_recvfrom_raw) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8082); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_recvfrom_rdm) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8083); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(c_test_network_recvfrom_seqpacket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8084); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} // * * * * * * * * * * * * * * * * * * * * * * * * // * Fossil Logic Test Pool @@ -98,6 +277,22 @@ FOSSIL_TEST_GROUP(c_network_tests) { FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind); FOSSIL_TEST_ADD(c_network_suite, c_test_network_listen); FOSSIL_TEST_ADD(c_network_suite, c_test_network_close); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_udp_socket); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_raw_socket); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_rdm_socket); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_seqpacket_socket); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_raw); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_rdm); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_seqpacket); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_raw); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_rdm); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_seqpacket); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_raw); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_rdm); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_seqpacket); FOSSIL_TEST_REGISTER(c_network_suite); } diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index 90fb930..c6a68f3 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -51,7 +51,7 @@ FOSSIL_TEST_CASE(cpp_test_network_init) { FOSSIL_TEST_CASE(cpp_test_network_create_socket) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil_io_network_close(sock); fossil_io_network_destroy(); @@ -59,7 +59,7 @@ FOSSIL_TEST_CASE(cpp_test_network_create_socket) { FOSSIL_TEST_CASE(cpp_test_network_bind) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); int result = fossil_io_network_bind(sock, "127.0.0.1", 8080); ASSUME_ITS_EQUAL_I32(0, result); @@ -69,7 +69,7 @@ FOSSIL_TEST_CASE(cpp_test_network_bind) { FOSSIL_TEST_CASE(cpp_test_network_listen) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil_io_network_bind(sock, "127.0.0.1", 8080); int result = fossil_io_network_listen(sock, 5); @@ -80,13 +80,193 @@ FOSSIL_TEST_CASE(cpp_test_network_listen) { FOSSIL_TEST_CASE(cpp_test_network_close) { fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil_io_network_close(sock); // No direct way to test close, but we assume no errors if it reaches here fossil_io_network_destroy(); } +FOSSIL_TEST_CASE(cpp_test_network_create_udp_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_bind_udp) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8081); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_sendto_udp) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, UDP!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8081); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_recvfrom_udp) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8081); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_create_raw_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_create_rdm_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_create_seqpacket_socket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_bind_raw) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8082); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_bind_rdm) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8083); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_bind_seqpacket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil_io_network_bind(sock, "127.0.0.1", 8084); + ASSUME_ITS_EQUAL_I32(0, result); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_sendto_raw) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, RAW!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8082); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_sendto_rdm) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, RDM!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8083); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_sendto_seqpacket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, SEQPACKET!"; + int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8084); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_recvfrom_raw) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8082); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_recvfrom_rdm) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8083); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + +FOSSIL_TEST_CASE(cpp_test_network_recvfrom_seqpacket) { + fossil_io_network_create(); + fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil_io_network_bind(sock, "127.0.0.1", 8084); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil_io_network_close(sock); + fossil_io_network_destroy(); +} + FOSSIL_TEST_CASE(cpp_test_network_class_init) { int result = fossil::io::Network::init(); ASSUME_ITS_EQUAL_I32(0, result); @@ -95,7 +275,7 @@ FOSSIL_TEST_CASE(cpp_test_network_class_init) { FOSSIL_TEST_CASE(cpp_test_network_class_create_socket) { fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil::io::Network::close(sock); fossil::io::Network::cleanup(); @@ -103,7 +283,7 @@ FOSSIL_TEST_CASE(cpp_test_network_class_create_socket) { FOSSIL_TEST_CASE(cpp_test_network_class_bind) { fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); int result = fossil::io::Network::bind(sock, "127.0.0.1", 8080); ASSUME_ITS_EQUAL_I32(0, result); @@ -113,7 +293,7 @@ FOSSIL_TEST_CASE(cpp_test_network_class_bind) { FOSSIL_TEST_CASE(cpp_test_network_class_listen) { fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil::io::Network::bind(sock, "127.0.0.1", 8080); int result = fossil::io::Network::listen(sock, 5); @@ -124,10 +304,189 @@ FOSSIL_TEST_CASE(cpp_test_network_class_listen) { FOSSIL_TEST_CASE(cpp_test_network_class_close) { fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_TCP); ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); fossil::io::Network::close(sock); - // No direct way to test close, but we assume no errors if it reaches here + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_create_udp_socket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_bind_udp) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil::io::Network::bind(sock, "127.0.0.1", 8081); + ASSUME_ITS_EQUAL_I32(0, result); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_sendto_udp) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, UDP!"; + int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8081); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_udp) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::bind(sock, "127.0.0.1", 8081); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_create_raw_socket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_create_rdm_socket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_create_seqpacket_socket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_bind_raw) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil::io::Network::bind(sock, "127.0.0.1", 8082); + ASSUME_ITS_EQUAL_I32(0, result); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_bind_rdm) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil::io::Network::bind(sock, "127.0.0.1", 8083); + ASSUME_ITS_EQUAL_I32(0, result); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_bind_seqpacket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + int result = fossil::io::Network::bind(sock, "127.0.0.1", 8084); + ASSUME_ITS_EQUAL_I32(0, result); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_sendto_raw) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, RAW!"; + int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8082); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_sendto_rdm) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, RDM!"; + int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8083); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_sendto_seqpacket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + const char *message = "Hello, SEQPACKET!"; + int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8084); + ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_raw) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::bind(sock, "127.0.0.1", 8082); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_rdm) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::bind(sock, "127.0.0.1", 8083); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil::io::Network::close(sock); + fossil::io::Network::cleanup(); +} + +FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_seqpacket) { + fossil::io::Network::init(); + fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); + ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); + fossil::io::Network::bind(sock, "127.0.0.1", 8084); + + char buffer[256]; + char sender_ip[INET_ADDRSTRLEN]; + uint16_t sender_port; + int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); + ASSUME_ITS_MORE_THAN_I32(0, bytes_received); + + fossil::io::Network::close(sock); fossil::io::Network::cleanup(); } @@ -141,12 +500,44 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_listen); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_close); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_udp_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_raw_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_rdm_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_seqpacket_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_raw); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_rdm); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_seqpacket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_raw); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_rdm); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_seqpacket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_raw); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_rdm); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_seqpacket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_init); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_socket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_listen); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_close); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_udp_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_raw_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_rdm_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_seqpacket_socket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_raw); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_rdm); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_seqpacket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_raw); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_rdm); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_seqpacket); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_raw); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_rdm); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_seqpacket); FOSSIL_TEST_REGISTER(cpp_network_suite); } From 88a162f38d836219e32d72e219ca2dba6c432c28 Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:17:04 -0600 Subject: [PATCH 02/10] expaned protocall support --- code/logic/fossil/io/network.h | 41 +++++++++++++++++++++++++++++++--- code/logic/network.c | 41 ++++++++++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/code/logic/fossil/io/network.h b/code/logic/fossil/io/network.h index 2c4ecf9..10300ad 100644 --- a/code/logic/fossil/io/network.h +++ b/code/logic/fossil/io/network.h @@ -32,6 +32,12 @@ #define FOSSIL_IO_INVALID_SOCKET (-1) #endif +#define FOSSIL_IO_SOCKET_TYPE_TCP SOCK_STREAM +#define FOSSIL_IO_SOCKET_TYPE_UDP SOCK_DGRAM +#define FOSSIL_IO_SOCKET_TYPE_RAW SOCK_RAW +#define FOSSIL_IO_SOCKET_TYPE_RDM SOCK_RDM +#define FOSSIL_IO_SOCKET_TYPE_SEQPACKET SOCK_SEQPACKET + #ifdef __cplusplus extern "C" { #endif @@ -51,7 +57,7 @@ void fossil_io_network_destroy(void); * Create a new TCP socket. * Returns a valid socket on success or FOSSIL_IO_INVALID_SOCKET on failure. */ -fossil_io_socket_t fossil_io_network_create_socket(void); +fossil_io_socket_t fossil_io_network_create_socket(int type); /** * Bind a socket to a specific port (IPv4/IPv6). @@ -94,8 +100,21 @@ int fossil_io_network_receive(fossil_io_socket_t sock, void *buffer, size_t len) */ void fossil_io_network_close(fossil_io_socket_t sock); +/** + * Send data to a specific IP address and port. + * Returns the number of bytes sent, or -1 on failure. + */ +int fossil_io_network_sendto(fossil_io_socket_t sock, const void *data, size_t len, const char *ip, uint16_t port); + +/** + * Receive data from a specific IP address and port. + * Returns the number of bytes received, or -1 on failure. + */ +int fossil_io_network_recvfrom(fossil_io_socket_t sock, void *buffer, size_t len, char *ip, uint16_t *port); + #ifdef __cplusplus } + /** * C++ wrapper for the output functions. */ @@ -128,8 +147,8 @@ namespace fossil { * Create a new TCP socket. * Returns a valid socket on success or FOSSIL_IO_INVALID_SOCKET on failure. */ - static fossil_io_socket_t create_socket(void) { - return fossil_io_network_create_socket(); + static fossil_io_socket_t create_socket(int type) { + return fossil_io_network_create_socket(type); } /** @@ -187,6 +206,22 @@ namespace fossil { fossil_io_network_close(sock); } + /** + * Send data to a specific IP address and port. + * Returns the number of bytes sent, or -1 on failure. + */ + static int sendto(fossil_io_socket_t sock, const void *data, size_t len, const char *ip, uint16_t port) { + return fossil_io_network_sendto(sock, data, len, ip, port); + } + + /** + * Receive data from a specific IP address and port. + * Returns the number of bytes received, or -1 on failure. + */ + static int recvfrom(fossil_io_socket_t sock, void *buffer, size_t len, char *ip, uint16_t *port) { + return fossil_io_network_recvfrom(sock, buffer, len, ip, port); + } + }; } } diff --git a/code/logic/network.c b/code/logic/network.c index a8b058d..65e7385 100644 --- a/code/logic/network.c +++ b/code/logic/network.c @@ -35,8 +35,8 @@ void fossil_io_network_destroy(void) { #endif } -fossil_io_socket_t fossil_io_network_create_socket(void) { - fossil_io_socket_t sock = socket(AF_INET, SOCK_STREAM, 0); +fossil_io_socket_t fossil_io_network_create_socket(int type) { + fossil_io_socket_t sock = socket(AF_INET, type, 0); if (sock == FOSSIL_IO_INVALID_SOCKET) { #ifdef _WIN32 fprintf(stderr, "Socket creation failed with error: %d\n", WSAGetLastError()); @@ -138,6 +138,43 @@ int fossil_io_network_receive(fossil_io_socket_t sock, void *buffer, size_t len) return bytes_received; } +int fossil_io_network_sendto(fossil_io_socket_t sock, const void *data, size_t len, const char *ip, uint16_t port) { + struct sockaddr_in dest_addr; + dest_addr.sin_family = AF_INET; + dest_addr.sin_port = htons(port); + dest_addr.sin_addr.s_addr = inet_addr(ip); + + int bytes_sent = sendto(sock, data, (int)len, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr)); + if (bytes_sent == -1) { +#ifdef _WIN32 + fprintf(stderr, "Sendto failed with error: %d\n", WSAGetLastError()); +#else + perror("Sendto failed"); +#endif + } + return bytes_sent; +} + +int fossil_io_network_recvfrom(fossil_io_socket_t sock, void *buffer, size_t len, char *ip, uint16_t *port) { + struct sockaddr_in src_addr; + socklen_t addr_len = sizeof(src_addr); + + int bytes_received = recvfrom(sock, buffer, (int)len, 0, (struct sockaddr*)&src_addr, &addr_len); + if (bytes_received == -1) { +#ifdef _WIN32 + fprintf(stderr, "Recvfrom failed with error: %d\n", WSAGetLastError()); +#else + perror("Recvfrom failed"); +#endif + } else if (ip) { + strcpy(ip, inet_ntoa(src_addr.sin_addr)); + if (port) { + *port = ntohs(src_addr.sin_port); + } + } + return bytes_received; +} + void fossil_io_network_close(fossil_io_socket_t sock) { #ifdef _WIN32 if (closesocket(sock) == SOCKET_ERROR) { From 65b22fdffe91f691a463277ce1785b722025fe08 Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:18:10 -0600 Subject: [PATCH 03/10] throw a few more protocalls --- code/logic/fossil/io/network.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/logic/fossil/io/network.h b/code/logic/fossil/io/network.h index 10300ad..e2b4475 100644 --- a/code/logic/fossil/io/network.h +++ b/code/logic/fossil/io/network.h @@ -37,6 +37,9 @@ #define FOSSIL_IO_SOCKET_TYPE_RAW SOCK_RAW #define FOSSIL_IO_SOCKET_TYPE_RDM SOCK_RDM #define FOSSIL_IO_SOCKET_TYPE_SEQPACKET SOCK_SEQPACKET +#define FOSSIL_IO_SOCKET_TYPE_PACKET SOCK_PACKET +#define FOSSIL_IO_SOCKET_TYPE_DCCP SOCK_DCCP +#define FOSSIL_IO_SOCKET_TYPE_SCTP SOCK_SCTP #ifdef __cplusplus extern "C" { From 775e0477448f3cab83875fcc37bb7d360c26e95e Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:28:01 -0600 Subject: [PATCH 04/10] focus on UDP and TCP support --- code/logic/fossil/io/network.h | 7 +- code/tests/cases/test_network.c | 147 ---------------- code/tests/cases/test_network.cpp | 270 ------------------------------ 3 files changed, 1 insertion(+), 423 deletions(-) diff --git a/code/logic/fossil/io/network.h b/code/logic/fossil/io/network.h index e2b4475..f137665 100644 --- a/code/logic/fossil/io/network.h +++ b/code/logic/fossil/io/network.h @@ -26,6 +26,7 @@ #include #include #include + #include #include #define closesocket close typedef int fossil_io_socket_t; @@ -34,12 +35,6 @@ #define FOSSIL_IO_SOCKET_TYPE_TCP SOCK_STREAM #define FOSSIL_IO_SOCKET_TYPE_UDP SOCK_DGRAM -#define FOSSIL_IO_SOCKET_TYPE_RAW SOCK_RAW -#define FOSSIL_IO_SOCKET_TYPE_RDM SOCK_RDM -#define FOSSIL_IO_SOCKET_TYPE_SEQPACKET SOCK_SEQPACKET -#define FOSSIL_IO_SOCKET_TYPE_PACKET SOCK_PACKET -#define FOSSIL_IO_SOCKET_TYPE_DCCP SOCK_DCCP -#define FOSSIL_IO_SOCKET_TYPE_SCTP SOCK_SCTP #ifdef __cplusplus extern "C" { diff --git a/code/tests/cases/test_network.c b/code/tests/cases/test_network.c index e3d508e..c0b01fc 100644 --- a/code/tests/cases/test_network.c +++ b/code/tests/cases/test_network.c @@ -132,141 +132,6 @@ FOSSIL_TEST_CASE(c_test_network_recvfrom_udp) { fossil_io_network_destroy(); } -FOSSIL_TEST_CASE(c_test_network_create_raw_socket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_create_rdm_socket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_create_seqpacket_socket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_bind_raw) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil_io_network_bind(sock, "127.0.0.1", 8082); - ASSUME_ITS_EQUAL_I32(0, result); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_bind_rdm) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil_io_network_bind(sock, "127.0.0.1", 8083); - ASSUME_ITS_EQUAL_I32(0, result); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_bind_seqpacket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil_io_network_bind(sock, "127.0.0.1", 8084); - ASSUME_ITS_EQUAL_I32(0, result); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_sendto_raw) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, RAW!"; - int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8082); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_sendto_rdm) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, RDM!"; - int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8083); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_sendto_seqpacket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, SEQPACKET!"; - int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8084); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_recvfrom_raw) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8082); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_recvfrom_rdm) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8083); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(c_test_network_recvfrom_seqpacket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8084); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - // * * * * * * * * * * * * * * * * * * * * * * * * // * Fossil Logic Test Pool // * * * * * * * * * * * * * * * * * * * * * * * * @@ -281,18 +146,6 @@ FOSSIL_TEST_GROUP(c_network_tests) { FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_raw_socket); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_rdm_socket); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_seqpacket_socket); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_raw); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_rdm); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_seqpacket); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_raw); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_rdm); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_seqpacket); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_raw); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_rdm); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_seqpacket); FOSSIL_TEST_REGISTER(c_network_suite); } diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index c6a68f3..c974f7c 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -132,141 +132,6 @@ FOSSIL_TEST_CASE(cpp_test_network_recvfrom_udp) { fossil_io_network_destroy(); } -FOSSIL_TEST_CASE(cpp_test_network_create_raw_socket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_create_rdm_socket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_create_seqpacket_socket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_bind_raw) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil_io_network_bind(sock, "127.0.0.1", 8082); - ASSUME_ITS_EQUAL_I32(0, result); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_bind_rdm) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil_io_network_bind(sock, "127.0.0.1", 8083); - ASSUME_ITS_EQUAL_I32(0, result); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_bind_seqpacket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil_io_network_bind(sock, "127.0.0.1", 8084); - ASSUME_ITS_EQUAL_I32(0, result); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_sendto_raw) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, RAW!"; - int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8082); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_sendto_rdm) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, RDM!"; - int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8083); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_sendto_seqpacket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, SEQPACKET!"; - int bytes_sent = fossil_io_network_sendto(sock, message, strlen(message), "127.0.0.1", 8084); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_recvfrom_raw) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8082); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_recvfrom_rdm) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8083); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - -FOSSIL_TEST_CASE(cpp_test_network_recvfrom_seqpacket) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8084); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - FOSSIL_TEST_CASE(cpp_test_network_class_init) { int result = fossil::io::Network::init(); ASSUME_ITS_EQUAL_I32(0, result); @@ -355,141 +220,6 @@ FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_udp) { fossil::io::Network::cleanup(); } -FOSSIL_TEST_CASE(cpp_test_network_class_create_raw_socket) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_create_rdm_socket) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_create_seqpacket_socket) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_bind_raw) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil::io::Network::bind(sock, "127.0.0.1", 8082); - ASSUME_ITS_EQUAL_I32(0, result); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_bind_rdm) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil::io::Network::bind(sock, "127.0.0.1", 8083); - ASSUME_ITS_EQUAL_I32(0, result); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_bind_seqpacket) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - int result = fossil::io::Network::bind(sock, "127.0.0.1", 8084); - ASSUME_ITS_EQUAL_I32(0, result); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_sendto_raw) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, RAW!"; - int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8082); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_sendto_rdm) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, RDM!"; - int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8083); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_sendto_seqpacket) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - const char *message = "Hello, SEQPACKET!"; - int bytes_sent = fossil::io::Network::sendto(sock, message, strlen(message), "127.0.0.1", 8084); - ASSUME_ITS_EQUAL_I32((int)strlen(message), bytes_sent); - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_raw) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RAW); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::bind(sock, "127.0.0.1", 8082); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_rdm) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_RDM); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::bind(sock, "127.0.0.1", 8083); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - -FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_seqpacket) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_SEQPACKET); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::bind(sock, "127.0.0.1", 8084); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - // * * * * * * * * * * * * * * * * * * * * * * * * // * Fossil Logic Test Pool // * * * * * * * * * * * * * * * * * * * * * * * * From 4b60cd4e0007b71629022632c6a260530c30a76a Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:31:03 -0600 Subject: [PATCH 05/10] remove these unused test calls --- code/tests/cases/test_network.cpp | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index c974f7c..4823895 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -234,18 +234,6 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_raw_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_rdm_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_seqpacket_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_raw); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_rdm); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_seqpacket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_raw); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_rdm); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_seqpacket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_raw); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_rdm); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_seqpacket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_init); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_socket); @@ -256,18 +244,6 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_raw_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_rdm_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_seqpacket_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_raw); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_rdm); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_seqpacket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_raw); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_rdm); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_seqpacket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_raw); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_rdm); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_seqpacket); FOSSIL_TEST_REGISTER(cpp_network_suite); } From 7f86f6251e4e971bfb1ab788ed0af2b98f0d67cb Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:35:14 -0600 Subject: [PATCH 06/10] try determin UDP --- code/tests/cases/test_network.c | 6 +++--- code/tests/cases/test_network.cpp | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/tests/cases/test_network.c b/code/tests/cases/test_network.c index c0b01fc..61faecf 100644 --- a/code/tests/cases/test_network.c +++ b/code/tests/cases/test_network.c @@ -143,9 +143,9 @@ FOSSIL_TEST_GROUP(c_network_tests) { FOSSIL_TEST_ADD(c_network_suite, c_test_network_listen); FOSSIL_TEST_ADD(c_network_suite, c_test_network_close); FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_udp_socket); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); - FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); + // FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); + // FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); + // FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); FOSSIL_TEST_REGISTER(c_network_suite); } diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index 4823895..10acfba 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -231,9 +231,9 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_listen); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_close); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_udp_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); + // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); + // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); + // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_init); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_socket); @@ -241,9 +241,9 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_listen); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_close); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_udp_socket); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); - FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); + // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); + // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); + // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); FOSSIL_TEST_REGISTER(cpp_network_suite); } From 39bac90eefb7749fa19a6d326474cd92e0054060 Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:37:45 -0600 Subject: [PATCH 07/10] attempt bind with UDP --- code/tests/cases/test_network.c | 2 +- code/tests/cases/test_network.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/tests/cases/test_network.c b/code/tests/cases/test_network.c index 61faecf..12de787 100644 --- a/code/tests/cases/test_network.c +++ b/code/tests/cases/test_network.c @@ -143,7 +143,7 @@ FOSSIL_TEST_GROUP(c_network_tests) { FOSSIL_TEST_ADD(c_network_suite, c_test_network_listen); FOSSIL_TEST_ADD(c_network_suite, c_test_network_close); FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_udp_socket); - // FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); // FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); // FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index 10acfba..01610f5 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -231,7 +231,7 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_listen); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_close); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_udp_socket); - // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); @@ -241,7 +241,7 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_listen); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_close); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_udp_socket); - // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); From 344694945b35edf9458ab99cce20cfd883c26cb3 Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:51:13 -0600 Subject: [PATCH 08/10] adding bridge --- code/logic/fossil/io/network.h | 220 ++++++++++++++++++++++++++------- code/logic/network.c | 13 ++ 2 files changed, 189 insertions(+), 44 deletions(-) diff --git a/code/logic/fossil/io/network.h b/code/logic/fossil/io/network.h index f137665..935750f 100644 --- a/code/logic/fossil/io/network.h +++ b/code/logic/fossil/io/network.h @@ -41,75 +41,140 @@ extern "C" { #endif /** - * Initialize the network stack (needed for Windows). - * Returns 0 on success, non-zero on failure. + * Initialize the network stack. This function is necessary for Windows + * platforms to set up the Winsock library. On other platforms, it may + * perform other necessary initializations. + * + * @return 0 on success, non-zero on failure. */ int fossil_io_network_create(void); /** - * Clean up network stack (needed for Windows). + * Clean up the network stack. This function is necessary for Windows + * platforms to clean up the Winsock library. On other platforms, it may + * perform other necessary clean-up operations. */ void fossil_io_network_destroy(void); /** - * Create a new TCP socket. - * Returns a valid socket on success or FOSSIL_IO_INVALID_SOCKET on failure. + * Create a new socket of the specified type (TCP or UDP). + * + * @param type The type of socket to create (e.g., SOCK_STREAM for TCP, SOCK_DGRAM for UDP). + * @return A valid socket on success, or FOSSIL_IO_INVALID_SOCKET on failure. */ fossil_io_socket_t fossil_io_network_create_socket(int type); /** - * Bind a socket to a specific port (IPv4/IPv6). - * Returns 0 on success, -1 on failure. + * Bind a socket to a specific IP address and port. This function associates + * the socket with a local address so that it can listen for incoming connections + * or send data. + * + * @param sock The socket to bind. + * @param ip The IP address to bind to (e.g., "127.0.0.1" for localhost). + * @param port The port number to bind to. + * @return 0 on success, -1 on failure. */ int fossil_io_network_bind(fossil_io_socket_t sock, const char *ip, uint16_t port); /** - * Listen for incoming connections. - * Returns 0 on success, -1 on failure. + * Listen for incoming connections on a bound socket. This function puts the + * socket into a state where it can accept incoming connection requests. + * + * @param sock The socket to listen on. + * @param backlog The maximum length of the queue of pending connections. + * @return 0 on success, -1 on failure. */ int fossil_io_network_listen(fossil_io_socket_t sock, int backlog); /** - * Accept a new connection. - * Returns a valid socket on success, or FOSSIL_IO_INVALID_SOCKET on failure. + * Accept a new incoming connection on a listening socket. This function + * extracts the first connection request on the queue of pending connections + * and creates a new socket for the connection. + * + * @param sock The listening socket. + * @param client_ip A buffer to store the IP address of the connecting client. + * @param client_port A pointer to store the port number of the connecting client. + * @return A valid socket for the new connection on success, or FOSSIL_IO_INVALID_SOCKET on failure. */ fossil_io_socket_t fossil_io_network_accept(fossil_io_socket_t sock, char *client_ip, uint16_t *client_port); /** - * Connect to a remote server. - * Returns 0 on success, -1 on failure. + * Connect to a remote server. This function establishes a connection to a + * specified IP address and port. + * + * @param sock The socket to use for the connection. + * @param ip The IP address of the remote server. + * @param port The port number of the remote server. + * @return 0 on success, -1 on failure. */ int fossil_io_network_connect(fossil_io_socket_t sock, const char *ip, uint16_t port); /** - * Send data over a socket. - * Returns the number of bytes sent, or -1 on failure. + * Send data over a connected socket. This function transmits data to the + * remote peer connected to the socket. + * + * @param sock The socket to use for sending data. + * @param data A pointer to the data to be sent. + * @param len The length of the data to be sent. + * @return The number of bytes sent, or -1 on failure. */ int fossil_io_network_send(fossil_io_socket_t sock, const void *data, size_t len); /** - * Receive data from a socket. - * Returns the number of bytes received, or -1 on failure. + * Receive data from a connected socket. This function reads data from the + * remote peer connected to the socket. + * + * @param sock The socket to use for receiving data. + * @param buffer A buffer to store the received data. + * @param len The maximum length of data to be received. + * @return The number of bytes received, or -1 on failure. */ int fossil_io_network_receive(fossil_io_socket_t sock, void *buffer, size_t len); /** - * Close a socket. + * Close a socket. This function releases the resources associated with the + * socket and closes the connection. + * + * @param sock The socket to be closed. */ void fossil_io_network_close(fossil_io_socket_t sock); /** - * Send data to a specific IP address and port. - * Returns the number of bytes sent, or -1 on failure. + * Send data to a specific IP address and port using a UDP socket. This function + * transmits data to the specified address and port without establishing a connection. + * + * @param sock The socket to use for sending data. + * @param data A pointer to the data to be sent. + * @param len The length of the data to be sent. + * @param ip The IP address of the destination. + * @param port The port number of the destination. + * @return The number of bytes sent, or -1 on failure. */ int fossil_io_network_sendto(fossil_io_socket_t sock, const void *data, size_t len, const char *ip, uint16_t port); /** - * Receive data from a specific IP address and port. - * Returns the number of bytes received, or -1 on failure. + * Receive data from a specific IP address and port using a UDP socket. This function + * reads data from the specified address and port without establishing a connection. + * + * @param sock The socket to use for receiving data. + * @param buffer A buffer to store the received data. + * @param len The maximum length of data to be received. + * @param ip A buffer to store the IP address of the sender. + * @param port A pointer to store the port number of the sender. + * @return The number of bytes received, or -1 on failure. */ int fossil_io_network_recvfrom(fossil_io_socket_t sock, void *buffer, size_t len, char *ip, uint16_t *port); +/** + * Bridge function for network operations. This function can be used to + * transfer data between two sockets, effectively bridging them. + * + * @param sock1 The first socket. + * @param sock2 The second socket. + * @return 0 on success, -1 on failure. + */ +int fossil_io_network_bridge(fossil_io_socket_t sock1, fossil_io_socket_t sock2); + #ifdef __cplusplus } @@ -127,99 +192,166 @@ namespace fossil { class Network { public: /** - * Initialize the network stack (needed for Windows). - * Returns 0 on success, non-zero on failure. + * Initialize the network stack. This function is necessary for Windows + * platforms to set up the Winsock library. On other platforms, it may + * perform other necessary initializations. + * + * @return 0 on success, non-zero on failure. */ static int init(void) { return fossil_io_network_create(); } /** - * Clean up network stack (needed for Windows). + * Clean up the network stack. This function is necessary for Windows + * platforms to clean up the Winsock library. On other platforms, it may + * perform other necessary clean-up operations. */ static void cleanup(void) { fossil_io_network_destroy(); } /** - * Create a new TCP socket. - * Returns a valid socket on success or FOSSIL_IO_INVALID_SOCKET on failure. + * Create a new socket of the specified type (TCP or UDP). + * + * @param type The type of socket to create (e.g., SOCK_STREAM for TCP, SOCK_DGRAM for UDP). + * @return A valid socket on success, or FOSSIL_IO_INVALID_SOCKET on failure. */ static fossil_io_socket_t create_socket(int type) { return fossil_io_network_create_socket(type); } /** - * Bind a socket to a specific port (IPv4/IPv6). - * Returns 0 on success, -1 on failure. + * Bind a socket to a specific IP address and port. This function associates + * the socket with a local address so that it can listen for incoming connections + * or send data. + * + * @param sock The socket to bind. + * @param ip The IP address to bind to (e.g., "127.0.0.1" for localhost). + * @param port The port number to bind to. + * @return 0 on success, -1 on failure. */ static int bind(fossil_io_socket_t sock, const char *ip, uint16_t port) { return fossil_io_network_bind(sock, ip, port); } /** - * Listen for incoming connections. - * Returns 0 on success, -1 on failure. + * Listen for incoming connections on a bound socket. This function puts the + * socket into a state where it can accept incoming connection requests. + * + * @param sock The socket to listen on. + * @param backlog The maximum length of the queue of pending connections. + * @return 0 on success, -1 on failure. */ static int listen(fossil_io_socket_t sock, int backlog) { return fossil_io_network_listen(sock, backlog); } /** - * Accept a new connection. - * Returns a valid socket on success, or FOSSIL_IO_INVALID_SOCKET on failure. + * Accept a new incoming connection on a listening socket. This function + * extracts the first connection request on the queue of pending connections + * and creates a new socket for the connection. + * + * @param sock The listening socket. + * @param client_ip A buffer to store the IP address of the connecting client. + * @param client_port A pointer to store the port number of the connecting client. + * @return A valid socket for the new connection on success, or FOSSIL_IO_INVALID_SOCKET on failure. */ static fossil_io_socket_t accept(fossil_io_socket_t sock, char *client_ip, uint16_t *client_port) { return fossil_io_network_accept(sock, client_ip, client_port); } /** - * Connect to a remote server. - * Returns 0 on success, -1 on failure. + * Connect to a remote server. This function establishes a connection to a + * specified IP address and port. + * + * @param sock The socket to use for the connection. + * @param ip The IP address of the remote server. + * @param port The port number of the remote server. + * @return 0 on success, -1 on failure. */ static int connect(fossil_io_socket_t sock, const char *ip, uint16_t port) { return fossil_io_network_connect(sock, ip, port); } /** - * Send data over a socket. - * Returns the number of bytes sent, or -1 on failure. + * Send data over a connected socket. This function transmits data to the + * remote peer connected to the socket. + * + * @param sock The socket to use for sending data. + * @param data A pointer to the data to be sent. + * @param len The length of the data to be sent. + * @return The number of bytes sent, or -1 on failure. */ static int send(fossil_io_socket_t sock, const void *data, size_t len) { return fossil_io_network_send(sock, data, len); } /** - * Receive data from a socket. - * Returns the number of bytes received, or -1 on failure. + * Receive data from a connected socket. This function reads data from the + * remote peer connected to the socket. + * + * @param sock The socket to use for receiving data. + * @param buffer A buffer to store the received data. + * @param len The maximum length of data to be received. + * @return The number of bytes received, or -1 on failure. */ static int receive(fossil_io_socket_t sock, void *buffer, size_t len) { return fossil_io_network_receive(sock, buffer, len); } /** - * Close a socket. + * Close a socket. This function releases the resources associated with the + * socket and closes the connection. + * + * @param sock The socket to be closed. */ static void close(fossil_io_socket_t sock) { fossil_io_network_close(sock); } /** - * Send data to a specific IP address and port. - * Returns the number of bytes sent, or -1 on failure. + * Send data to a specific IP address and port using a UDP socket. This function + * transmits data to the specified address and port without establishing a connection. + * + * @param sock The socket to use for sending data. + * @param data A pointer to the data to be sent. + * @param len The length of the data to be sent. + * @param ip The IP address of the destination. + * @param port The port number of the destination. + * @return The number of bytes sent, or -1 on failure. */ static int sendto(fossil_io_socket_t sock, const void *data, size_t len, const char *ip, uint16_t port) { return fossil_io_network_sendto(sock, data, len, ip, port); } /** - * Receive data from a specific IP address and port. - * Returns the number of bytes received, or -1 on failure. + * Receive data from a specific IP address and port using a UDP socket. This function + * reads data from the specified address and port without establishing a connection. + * + * @param sock The socket to use for receiving data. + * @param buffer A buffer to store the received data. + * @param len The maximum length of data to be received. + * @param ip A buffer to store the IP address of the sender. + * @param port A pointer to store the port number of the sender. + * @return The number of bytes received, or -1 on failure. */ static int recvfrom(fossil_io_socket_t sock, void *buffer, size_t len, char *ip, uint16_t *port) { return fossil_io_network_recvfrom(sock, buffer, len, ip, port); } + /** + * Bridge function for network operations. This function can be used to + * transfer data between two sockets, effectively bridging them. + * + * @param sock1 The first socket. + * @param sock2 The second socket. + * @return 0 on success, -1 on failure. + */ + static int bridge(fossil_io_socket_t sock1, fossil_io_socket_t sock2) { + return fossil_io_network_bridge(sock1, sock2); + } + }; } } diff --git a/code/logic/network.c b/code/logic/network.c index 65e7385..2265d90 100644 --- a/code/logic/network.c +++ b/code/logic/network.c @@ -186,3 +186,16 @@ void fossil_io_network_close(fossil_io_socket_t sock) { } #endif } + +int fossil_io_network_bridge(fossil_io_socket_t sock1, fossil_io_socket_t sock2) { + char buffer[1024]; + int bytes_received; + + while ((bytes_received = fossil_io_network_receive(sock1, buffer, sizeof(buffer))) > 0) { + if (fossil_io_network_send(sock2, buffer, bytes_received) == -1) { + return -1; + } + } + + return bytes_received; +} From 21b6bddc56f2b3814601e3c9f2af9a8f9a36d039 Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 12:52:05 -0600 Subject: [PATCH 09/10] checkout sendto UDP --- code/tests/cases/test_network.c | 2 +- code/tests/cases/test_network.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/tests/cases/test_network.c b/code/tests/cases/test_network.c index 12de787..d2cfab9 100644 --- a/code/tests/cases/test_network.c +++ b/code/tests/cases/test_network.c @@ -144,7 +144,7 @@ FOSSIL_TEST_GROUP(c_network_tests) { FOSSIL_TEST_ADD(c_network_suite, c_test_network_close); FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_udp_socket); FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); - // FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); + FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); // FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); FOSSIL_TEST_REGISTER(c_network_suite); diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index 01610f5..7c7ddd8 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -232,7 +232,7 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_close); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_udp_socket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); - // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_init); @@ -242,7 +242,7 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_close); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_udp_socket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); - // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); + FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); FOSSIL_TEST_REGISTER(cpp_network_suite); From 19ec3a9b842c62711b619632e23527476f88898b Mon Sep 17 00:00:00 2001 From: "Michael Gene Brockus (Dreamer)" Date: Sun, 9 Feb 2025 13:00:30 -0600 Subject: [PATCH 10/10] rm extra cases in need of mock server --- code/tests/cases/test_network.c | 17 ---------------- code/tests/cases/test_network.cpp | 34 ------------------------------- 2 files changed, 51 deletions(-) diff --git a/code/tests/cases/test_network.c b/code/tests/cases/test_network.c index d2cfab9..387ffe6 100644 --- a/code/tests/cases/test_network.c +++ b/code/tests/cases/test_network.c @@ -116,22 +116,6 @@ FOSSIL_TEST_CASE(c_test_network_sendto_udp) { fossil_io_network_destroy(); } -FOSSIL_TEST_CASE(c_test_network_recvfrom_udp) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8081); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - // * * * * * * * * * * * * * * * * * * * * * * * * // * Fossil Logic Test Pool // * * * * * * * * * * * * * * * * * * * * * * * * @@ -145,7 +129,6 @@ FOSSIL_TEST_GROUP(c_network_tests) { FOSSIL_TEST_ADD(c_network_suite, c_test_network_create_udp_socket); FOSSIL_TEST_ADD(c_network_suite, c_test_network_bind_udp); FOSSIL_TEST_ADD(c_network_suite, c_test_network_sendto_udp); - // FOSSIL_TEST_ADD(c_network_suite, c_test_network_recvfrom_udp); FOSSIL_TEST_REGISTER(c_network_suite); } diff --git a/code/tests/cases/test_network.cpp b/code/tests/cases/test_network.cpp index 7c7ddd8..75388a0 100644 --- a/code/tests/cases/test_network.cpp +++ b/code/tests/cases/test_network.cpp @@ -116,22 +116,6 @@ FOSSIL_TEST_CASE(cpp_test_network_sendto_udp) { fossil_io_network_destroy(); } -FOSSIL_TEST_CASE(cpp_test_network_recvfrom_udp) { - fossil_io_network_create(); - fossil_io_socket_t sock = fossil_io_network_create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil_io_network_bind(sock, "127.0.0.1", 8081); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil_io_network_recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil_io_network_close(sock); - fossil_io_network_destroy(); -} - FOSSIL_TEST_CASE(cpp_test_network_class_init) { int result = fossil::io::Network::init(); ASSUME_ITS_EQUAL_I32(0, result); @@ -204,22 +188,6 @@ FOSSIL_TEST_CASE(cpp_test_network_class_sendto_udp) { fossil::io::Network::cleanup(); } -FOSSIL_TEST_CASE(cpp_test_network_class_recvfrom_udp) { - fossil::io::Network::init(); - fossil_io_socket_t sock = fossil::io::Network::create_socket(FOSSIL_IO_SOCKET_TYPE_UDP); - ASSUME_NOT_EQUAL_I32(FOSSIL_IO_INVALID_SOCKET, sock); - fossil::io::Network::bind(sock, "127.0.0.1", 8081); - - char buffer[256]; - char sender_ip[INET_ADDRSTRLEN]; - uint16_t sender_port; - int bytes_received = fossil::io::Network::recvfrom(sock, buffer, sizeof(buffer), sender_ip, &sender_port); - ASSUME_ITS_MORE_THAN_I32(0, bytes_received); - - fossil::io::Network::close(sock); - fossil::io::Network::cleanup(); -} - // * * * * * * * * * * * * * * * * * * * * * * * * // * Fossil Logic Test Pool // * * * * * * * * * * * * * * * * * * * * * * * * @@ -233,7 +201,6 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_create_udp_socket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_bind_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_sendto_udp); - // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_recvfrom_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_init); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_socket); @@ -243,7 +210,6 @@ FOSSIL_TEST_GROUP(cpp_network_tests) { FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_create_udp_socket); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_bind_udp); FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_sendto_udp); - // FOSSIL_TEST_ADD(cpp_network_suite, cpp_test_network_class_recvfrom_udp); FOSSIL_TEST_REGISTER(cpp_network_suite); }