From b5c18cd0dea765aea561f1be5f91e28f5b6b362e Mon Sep 17 00:00:00 2001 From: BodgeMaster <> Date: Sun, 23 Oct 2022 01:48:47 +0200 Subject: [PATCH] tools/hexnet: Implement bi-directional communication --- src/tools/hexnet.cpp | 94 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 14 deletions(-) diff --git a/src/tools/hexnet.cpp b/src/tools/hexnet.cpp index 9088353..04c88f3 100644 --- a/src/tools/hexnet.cpp +++ b/src/tools/hexnet.cpp @@ -148,6 +148,26 @@ void readFromTCP() { } } +void writeToTCP() { + while (!exitProgram) { + if (outgoing) { + if (tcpConnector.write(readByteFromStdin()) == -1 && !exitProgram) { + exitProgram = true; + tcpConnector.shutdown(SHUT_RD); + std::cerr << "Error while sending data: " << tcpConnector.last_error_str() << std::endl; + return; + } + } else { + if (tcpSocket.write(readByteFromStdin()) == -1 && !exitProgram) { + exitProgram = true; + tcpSocket.shutdown(SHUT_RD); + std::cerr << "Error while sending data: " << tcpSocket.last_error_str() << std::endl; + return; + } + } + } +} + void readFromTCP6() { ssize_t byteCount; while (!exitProgram && (outgoing? (byteCount = tcp6Connector.read(networkBuffer, bufferSize)) > 0 : (byteCount = tcp6Socket.read(networkBuffer, bufferSize)) > 0)) { @@ -158,6 +178,26 @@ void readFromTCP6() { } } +void writeToTCP6() { + while (!exitProgram) { + if (outgoing) { + if (tcp6Connector.write(readByteFromStdin()) == -1 && !exitProgram) { + exitProgram = true; + tcp6Connector.shutdown(SHUT_RD); + std::cerr << "Error while sending data: " << tcp6Connector.last_error_str() << std::endl; + return; + } + } else { + if (tcp6Socket.write(readByteFromStdin()) == -1 && !exitProgram) { + exitProgram = true; + tcp6Socket.shutdown(SHUT_RD); + std::cerr << "Error while sending data: " << tcp6Socket.last_error_str() << std::endl; + return; + } + } + } +} + void readFromUDP() { ssize_t byteCount; sockpp::udp_socket::addr_t peer; @@ -170,6 +210,17 @@ void readFromUDP() { } } +void writeToUDP(sockpp::udp_socket::addr_t peer) { + while (!exitProgram) { + if (udpSocket.send_to(readByteFromStdin(), peer) == -1 && !exitProgram) { + exitProgram = true; + udpSocket.shutdown(SHUT_RD); + std::cerr << "Error while sending data: " << udpSocket.last_error_str() << std::endl; + return; + } + } +} + void readFromUDP6() { ssize_t byteCount; sockpp::udp6_socket::addr_t peer; @@ -182,6 +233,17 @@ void readFromUDP6() { } } +void writeToUDP6(sockpp::udp6_socket::addr_t peer) { + while (!exitProgram) { + if (udp6Socket.send_to(readByteFromStdin(), peer) == -1 && !exitProgram) { + exitProgram = true; + udp6Socket.shutdown(SHUT_RD); + std::cerr << "Error while sending data: " << udp6Socket.last_error_str() << std::endl; + return; + } + } +} + int main(int argc, char* argv[]) { std::signal(SIGINT, signalHandler); std::signal(SIGTERM, signalHandler); @@ -263,10 +325,10 @@ int main(int argc, char* argv[]) { } std::thread threadReadFromTCP = std::thread(readFromTCP); - //std::thread threadWriteToTCP = std::thread(writeToTCP); + std::thread threadWriteToTCP = std::thread(writeToTCP); threadReadFromTCP.join(); - //threadWriteToTCP.join(); + threadWriteToTCP.join(); std::cout << std::endl; return EXIT_SUCCESS; @@ -280,10 +342,10 @@ int main(int argc, char* argv[]) { } std::thread threadReadFromTCP6 = std::thread(readFromTCP6); - //std::thread threadWriteToTCP6 = std::thread(writeToTCP6); + std::thread threadWriteToTCP6 = std::thread(writeToTCP6); threadReadFromTCP6.join(); - //threadWriteToTCP6.join(); + threadWriteToTCP6.join(); std::cout << std::endl; return EXIT_SUCCESS; @@ -296,16 +358,17 @@ int main(int argc, char* argv[]) { std::cerr << "Error creating UDP socket: " << udpSocket.last_error_str() << std::endl; } // Btw: Did you know that UDP has no concept of a connection? - if (!udpSocket.connect(sockpp::inet_address(host, port))) { + sockpp::udp_socket::addr_t peer = sockpp::inet_address(host, port); + if (!udpSocket.connect(peer)) { std::cerr << "Error associating socket with " << host << " port " << port << std::endl; std::cerr << udpSocket.last_error_str() << std::endl; } std::thread threadReadFromUDP = std::thread(readFromUDP); - //std::thread threadWriteToUDP = std::thread(writeToUDP); + std::thread threadWriteToUDP = std::thread(writeToUDP, peer); threadReadFromUDP.join(); - //threadWriteToUDP.join(); + threadWriteToUDP.join(); std::cout << std::endl; return EXIT_SUCCESS; @@ -315,16 +378,17 @@ int main(int argc, char* argv[]) { std::cerr << "Error creating UDP socket: " << udp6Socket.last_error_str() << std::endl; } // Btw: Did you know that UDP has no concept of a connection? - if (!udp6Socket.connect(sockpp::inet6_address(host, port))) { + sockpp::udp6_socket::addr_t peer = sockpp::inet6_address(host, port); + if (!udp6Socket.connect(peer)) { std::cerr << "Error associating socket with " << host << " port " << port << std::endl; std::cerr << udp6Socket.last_error_str() << std::endl; } std::thread threadReadFromUDP6 = std::thread(readFromUDP6); - //std::thread threadWriteToUDP6 = std::thread(writeToUDP6); + std::thread threadWriteToUDP6 = std::thread(writeToUDP6, peer); threadReadFromUDP6.join(); - //threadWriteToUDP6.join(); + threadWriteToUDP6.join(); std::cout << std::endl; return EXIT_SUCCESS; @@ -350,10 +414,10 @@ int main(int argc, char* argv[]) { } std::thread threadReadFromTCP = std::thread(readFromTCP); - //std::thread threadWriteToTCP = std::thread(writeToTCP); + std::thread threadWriteToTCP = std::thread(writeToTCP); threadReadFromTCP.join(); - //threadWriteToTCP.join(); + threadWriteToTCP.join(); std::cout << std::endl; return EXIT_SUCCESS; @@ -374,10 +438,10 @@ int main(int argc, char* argv[]) { } std::thread threadReadFromTCP6 = std::thread(readFromTCP6); - //std::thread threadWriteToTCP6 = std::thread(writeToTCP6); + std::thread threadWriteToTCP6 = std::thread(writeToTCP6); threadReadFromTCP6.join(); - //threadWriteToTCP6.join(); + threadWriteToTCP6.join(); std::cout << std::endl; return EXIT_SUCCESS; @@ -398,6 +462,7 @@ int main(int argc, char* argv[]) { } std::thread threadReadFromUDP = std::thread(readFromUDP); + // Can't send bc we have no idea where to send to. //std::thread threadWriteToUDP = std::thread(writeToUDP); threadReadFromUDP.join(); @@ -415,6 +480,7 @@ int main(int argc, char* argv[]) { } std::thread threadReadFromUDP6 = std::thread(readFromUDP6); + // Can't send bc we have no idea where to send to. //std::thread threadWriteToUDP6 = std::thread(writeToUDP6); threadReadFromUDP6.join();