From 56655d2d7ffee75f59938fdc56779b1115f7a8f4 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Thu, 26 Mar 2026 17:06:22 +0100 Subject: [PATCH 01/64] update: correct Methods to METHODS --- TabloClient/src/utils/networking.cpp | 28 +++++++++---------- .../src/utils/client_session_controller.cpp | 16 +++++------ TabloMaster/src/utils/networking.cpp | 2 +- .../src/utils/node_session_controller.cpp | 16 +++++------ TabloMaster/src/utils/udp_discovery.cpp | 4 +-- TabloNode/src/utils/networking.cpp | 26 ++++++++--------- TabloNode/src/utils/udp_discovery.cpp | 6 ++-- TabloNode/src/utils/worker.cpp | 12 ++++---- lib/libtabnet/include/methods.h | 2 +- 9 files changed, 56 insertions(+), 56 deletions(-) diff --git a/TabloClient/src/utils/networking.cpp b/TabloClient/src/utils/networking.cpp index d67d8d0..e58d884 100644 --- a/TabloClient/src/utils/networking.cpp +++ b/TabloClient/src/utils/networking.cpp @@ -32,9 +32,9 @@ void Networking::networkingCycle(std::string tabloMaster) { while(true) { int orderCollectionSize = orderCollection.size(); - tabnet::sendMessage(clientSocket, Methods::size, std::to_string(orderCollectionSize)); + tabnet::sendMessage(clientSocket, METHODS::size, std::to_string(orderCollectionSize)); tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == Methods::success) { + if (response.method == METHODS::success) { for(int index = 0; index < orderCollectionSize; index++) { std::map order = orderCollection[0]; orderCollection.erase(orderCollection.begin()); @@ -43,40 +43,40 @@ void Networking::networkingCycle(std::string tabloMaster) { // Send data tabnet::sendMessage(clientSocket, method, order[method]); tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == Methods::success) { + if (response.method == METHODS::success) { std::wcout << "Send succeded!" << std::endl; } else { - std::wcout << "Expected: " << Methods::success << " (success) or " << Methods::failed << " (failed), but got " << response.method << std::endl; + std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; std::wcout << "With following payload" << response.payload.c_str() << std::endl; } } - } else if (response.method == Methods::failed) { + } else if (response.method == METHODS::failed) { std::wcout << "Something went wrong while sending the size! Master response: " << response.payload.c_str() << std::endl; } else { - std::wcout << "Expected: " << Methods::success << " (success) or " << Methods::failed << " (failed), but got " << response.method << std::endl; + std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; std::wcout << "With following payload" << response.payload.c_str() << std::endl; } //receive tabnet::Packet receivedPacket = tabnet::receiveMessage(clientSocket); - if (receivedPacket.method == Methods::size) { + if (receivedPacket.method == METHODS::size) { int count = std::stoi(receivedPacket.payload); if (count != 0) { - tabnet::sendMessage(clientSocket, Methods::success, ""); + tabnet::sendMessage(clientSocket, METHODS::success, ""); for(int i = 0; i < count; i++) { tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == Methods::response) { + if (response.method == METHODS::response) { solutionCollection.push_back(response.payload); - tabnet::sendMessage(clientSocket, Methods::success, ""); + tabnet::sendMessage(clientSocket, METHODS::success, ""); } else { - std::wcout << "Expected: " << Methods::response << " (response) got: " << receivedPacket.method << std::endl; - tabnet::sendMessage(clientSocket, Methods::failed, "Expected method response"); + std::wcout << "Expected: " << METHODS::response << " (response) got: " << receivedPacket.method << std::endl; + tabnet::sendMessage(clientSocket, METHODS::failed, "Expected method response"); } } } } else { - std::wcout << "Expected: " << Methods::size << " (size) got: " << receivedPacket.method << std::endl; - tabnet::sendMessage(clientSocket, Methods::failed, "Expected method size"); + std::wcout << "Expected: " << METHODS::size << " (size) got: " << receivedPacket.method << std::endl; + tabnet::sendMessage(clientSocket, METHODS::failed, "Expected method size"); } } } diff --git a/TabloMaster/src/utils/client_session_controller.cpp b/TabloMaster/src/utils/client_session_controller.cpp index 0854330..33c0c93 100644 --- a/TabloMaster/src/utils/client_session_controller.cpp +++ b/TabloMaster/src/utils/client_session_controller.cpp @@ -27,27 +27,27 @@ void ClientSessionManager::sessionControllerCycle() { while (responseCode >= 0) { // Recieve orders tabnet::Packet orderCount = tabnet::receiveMessage(this->socket); - if (orderCount.method == Methods::size) { - responseCode = tabnet::sendMessage(this->socket, Methods::success, ""); + if (orderCount.method == METHODS::size) { + responseCode = tabnet::sendMessage(this->socket, METHODS::success, ""); for (int index = 0; index < std::stoi(orderCount.payload); index++) { orderCollection.push_back(tabnet::receiveMessage(this->socket)); - responseCode = tabnet::sendMessage(this->socket, Methods::success, ""); + responseCode = tabnet::sendMessage(this->socket, METHODS::success, ""); } } else { - responseCode = tabnet::sendMessage(this->socket, Methods::failed, ""); + responseCode = tabnet::sendMessage(this->socket, METHODS::failed, ""); std::wcout << "Something went wrong during receiving size!" << std::endl; - std::wcout << "Got: " << orderCount.method << " instead of " << Methods::size << " (size)" << std::endl; + std::wcout << "Got: " << orderCount.method << " instead of " << METHODS::size << " (size)" << std::endl; } // Send solutions int solutionCollectionSize = solutionCollection.size(); - responseCode = tabnet::sendMessage(this->socket, Methods::size, std::to_string(solutionCollectionSize)); + responseCode = tabnet::sendMessage(this->socket, METHODS::size, std::to_string(solutionCollectionSize)); if (solutionCollectionSize > 0) { - if (tabnet::receiveMessage(this->socket).method == Methods::success) { + if (tabnet::receiveMessage(this->socket).method == METHODS::success) { for(int index = 0; index < solutionCollectionSize; index++) { responseCode = tabnet::sendMessage(this->socket, solutionCollection[0].method, solutionCollection[0].payload); - if (tabnet::receiveMessage(this->socket).method == Methods::success) { + if (tabnet::receiveMessage(this->socket).method == METHODS::success) { solutionCollection.erase(solutionCollection.begin()); } else { std::wcout << "Send of solution failed!" << std::endl; diff --git a/TabloMaster/src/utils/networking.cpp b/TabloMaster/src/utils/networking.cpp index 2a92575..95202f0 100644 --- a/TabloMaster/src/utils/networking.cpp +++ b/TabloMaster/src/utils/networking.cpp @@ -124,7 +124,7 @@ void Networking::handleClientConnection(int serverSocket, int clientSocket) { tabnet::Packet responseCode = tabnet::receiveMessage(newSocket); // handshake compleate - if(responseCode.method == Methods::success) { + if(responseCode.method == METHODS::success) { auto nodeSessionController = std::make_unique(); std::thread nodeSessionCycleThread( diff --git a/TabloMaster/src/utils/node_session_controller.cpp b/TabloMaster/src/utils/node_session_controller.cpp index 2a4dc85..f47b1ce 100644 --- a/TabloMaster/src/utils/node_session_controller.cpp +++ b/TabloMaster/src/utils/node_session_controller.cpp @@ -24,32 +24,32 @@ void NodeSessionController::sessionControllerCycle(int socket) { // Receive solutions tabnet::Packet solutionCount = tabnet::receiveMessage(socket); std::wcout << "solutionCount " << solutionCount.method << " payload " << solutionCount.payload.c_str() << std::endl; - if (solutionCount.method == Methods::size) { - responseCode = tabnet::sendMessage(socket, Methods::success, ""); + if (solutionCount.method == METHODS::size) { + responseCode = tabnet::sendMessage(socket, METHODS::success, ""); for (int index = 0; index < std::stoi(solutionCount.payload); index++) { tabnet::Packet packet = tabnet::receiveMessage(socket); std::wcout << "GOT SOLUTION -----> " << packet.method << std::endl; pushSolution(packet); - responseCode = tabnet::sendMessage(socket, Methods::success, ""); + responseCode = tabnet::sendMessage(socket, METHODS::success, ""); } } else { - responseCode = tabnet::sendMessage(socket, Methods::failed, ""); + responseCode = tabnet::sendMessage(socket, METHODS::failed, ""); std::wcout << "Something went wrong during receiving size!" << std::endl; - std::wcout << "Got: " << solutionCount.method << " instead of " << Methods::size << " (size)" << std::endl; + std::wcout << "Got: " << solutionCount.method << " instead of " << METHODS::size << " (size)" << std::endl; } tabnet::Packet ready = tabnet::receiveMessage(socket); // Send orders int orderCollectionSize = getOrderCollectionSize(); - responseCode = tabnet::sendMessage(socket, Methods::size, std::to_string(orderCollectionSize)); + responseCode = tabnet::sendMessage(socket, METHODS::size, std::to_string(orderCollectionSize)); if (orderCollectionSize > 0) { - if (tabnet::receiveMessage(socket).method == Methods::success) { + if (tabnet::receiveMessage(socket).method == METHODS::success) { for(int index = 0; index < orderCollectionSize; index++) { responseCode = tabnet::sendPacket(socket, popOrder()); tabnet::Packet response = tabnet::receiveMessage(socket); - if (response.method != Methods::success) { + if (response.method != METHODS::success) { std::wcout << "Send order to node failed: got " << response.method << std::endl; } } diff --git a/TabloMaster/src/utils/udp_discovery.cpp b/TabloMaster/src/utils/udp_discovery.cpp index 6c3600a..4d85f22 100644 --- a/TabloMaster/src/utils/udp_discovery.cpp +++ b/TabloMaster/src/utils/udp_discovery.cpp @@ -101,7 +101,7 @@ void UdpDiscovery::udpDiscoveryCycle(std::string interface) { while(true) { // Send message - if (tabnet::sendMessageTo(serverSocket, broadcast, Methods::ip, containerIP.c_str()) != 0) { + if (tabnet::sendMessageTo(serverSocket, broadcast, METHODS::ip, containerIP.c_str()) != 0) { std::wcout << "Broadcast failed!" << std::endl; return; } @@ -129,7 +129,7 @@ void UdpDiscovery::udpDiscoveryCycle(std::string interface) { tabnet::Packet data = tabnet::receiveMessage(tcpNodeSocket); // Add ip to discovered Ip's if not already in vector - if (data.method == Methods::ip && std::find(nodeIPAddresses.begin(), nodeIPAddresses.end(), std::string(data.payload)) == nodeIPAddresses.end()) { + if (data.method == METHODS::ip && std::find(nodeIPAddresses.begin(), nodeIPAddresses.end(), std::string(data.payload)) == nodeIPAddresses.end()) { nodeIPAddresses.push_back(std::string(data.payload)); } diff --git a/TabloNode/src/utils/networking.cpp b/TabloNode/src/utils/networking.cpp index e925247..6a4aa69 100644 --- a/TabloNode/src/utils/networking.cpp +++ b/TabloNode/src/utils/networking.cpp @@ -63,53 +63,53 @@ void Networking::handleClientConnection(int serverSocket, int clientSocket) { std::thread workerThread = std::thread(&Worker::solveOrderCycle, &worker); // Compleate Handshake - int responseCode = tabnet::sendMessage(clientSocket, Methods::success, ""); + int responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); while (true) { // // -> Hand back finished solution int solutionCollectionSize = worker.getSolutionCollectionSize(); - responseCode = tabnet::sendMessage(clientSocket, Methods::size, std::to_string(solutionCollectionSize)); + responseCode = tabnet::sendMessage(clientSocket, METHODS::size, std::to_string(solutionCollectionSize)); tabnet::Packet response = tabnet::receiveMessage(clientSocket); std::wcout << solutionCollectionSize << "<--- size" << std::endl; - if (response.method == Methods::success) { + if (response.method == METHODS::success) { for(int index = 0; index < solutionCollectionSize; index++) { // Send data tabnet::Packet solution = worker.getSolution(); std::wcout << "Handing back solution" << solution.method << std::endl; responseCode = tabnet::sendPacket(clientSocket, solution); tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == Methods::success) { + if (response.method == METHODS::success) { std::wcout << "Send succeded!" << std::endl; } else { - std::wcout << "Expected: " << Methods::success << " (success) or " << Methods::failed << " (failed), but got " << response.method << std::endl; + std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; std::wcout << "With following payload" << response.payload.c_str() << std::endl; } } - } else if (response.method == Methods::failed) { + } else if (response.method == METHODS::failed) { std::wcout << "Something went wrong while sending the size! Master response: " << response.payload.c_str() << std::endl; } else { - std::wcout << "Expected: " << Methods::success << " (success) or " << Methods::failed << " (failed), but got " << response.method << std::endl; + std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; std::wcout << "With following payload" << response.payload.c_str() << std::endl; } - responseCode = tabnet::sendMessage(clientSocket, Methods::ready, ""); + responseCode = tabnet::sendMessage(clientSocket, METHODS::ready, ""); //receive tabnet::Packet receivedPacket = tabnet::receiveMessage(clientSocket); - if (receivedPacket.method == Methods::size) { + if (receivedPacket.method == METHODS::size) { int count = std::stoi(receivedPacket.payload); if (count != 0) { - responseCode = tabnet::sendMessage(clientSocket, Methods::success, ""); + responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); for(int i = 0; i < count; i++) { tabnet::Packet order = tabnet::receiveMessage(clientSocket); worker.pushOrder(order); - responseCode = tabnet::sendMessage(clientSocket, Methods::success, ""); + responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); } } } else { - std::wcout << "Expected: " << Methods::size << " (size) got: " << receivedPacket.method << std::endl; - responseCode = tabnet::sendMessage(clientSocket, Methods::failed, "Expected method size"); + std::wcout << "Expected: " << METHODS::size << " (size) got: " << receivedPacket.method << std::endl; + responseCode = tabnet::sendMessage(clientSocket, METHODS::failed, "Expected method size"); } // Controlled shutdown of this thread, if the master crashes diff --git a/TabloNode/src/utils/udp_discovery.cpp b/TabloNode/src/utils/udp_discovery.cpp index 9d55924..5562e68 100644 --- a/TabloNode/src/utils/udp_discovery.cpp +++ b/TabloNode/src/utils/udp_discovery.cpp @@ -44,7 +44,7 @@ UdpDiscovery::UdpDiscovery(std::string interface) { while (true) { // Get UDP Discovery packet tabnet::Packet masterIP = tabnet::receiveMessage(udpSocket); - if (masterIP.method == Methods::ip) { + if (masterIP.method == METHODS::ip) { if (masterIP.payload.length() != 0 && tabnet::isValidIpV4(masterIP.payload)) { // DEBUG ONLY: //std::wcout << masterIP.c_str() << std::endl; @@ -68,13 +68,13 @@ UdpDiscovery::UdpDiscovery(std::string interface) { continue; } //send(recieveSocket, containerIP.c_str(), containerIP.size(), 0); - tabnet::sendMessage(recieveSocket, Methods::ip, containerIP.c_str()); + tabnet::sendMessage(recieveSocket, METHODS::ip, containerIP.c_str()); close(recieveSocket); } else { std::wcout << "Invalid ip!" << std::endl; } } else { - std::wcout << "Expected" << Methods::ip << " (ip) but got: " << masterIP.method << std::endl; + std::wcout << "Expected" << METHODS::ip << " (ip) but got: " << masterIP.method << std::endl; } } close(udpSocket); diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 9402e63..56edd5f 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -17,20 +17,20 @@ void Worker::solveOrderCycle() { tabnet::Packet order = getOrder(); switch (order.method) { - case Methods::test: + case METHODS::test: std::wcout << "TEST!" << std::endl; pushSolution(Worker::test(order)); break; - case Methods::setFile: + case METHODS::setFile: pushSolution(Worker::setFile(order)); break; - case Methods::empty: + case METHODS::empty: break; default: - std::wcout << "Unknown action: " << order.method << " -> Expected a method between " << Methods::START << " and " << Methods::END << std::endl; + std::wcout << "Unknown action: " << order.method << " -> Expected a method between " << METHODS::START << " and " << METHODS::END << std::endl; break; } } @@ -41,7 +41,7 @@ void Worker::solveOrderCycle() { // Logic functions tabnet::Packet Worker::test(tabnet::Packet packet) { tabnet::Packet solution; - solution.method = Methods::response; + solution.method = METHODS::response; solution.payload = packet.payload; return solution; } @@ -59,7 +59,7 @@ tabnet::Packet Worker::getOrder() { return firstOrder; } tabnet::Packet emptyPacket; - emptyPacket.method = Methods::empty; + emptyPacket.method = METHODS::empty; return emptyPacket; } diff --git a/lib/libtabnet/include/methods.h b/lib/libtabnet/include/methods.h index a387722..1c5f6cb 100644 --- a/lib/libtabnet/include/methods.h +++ b/lib/libtabnet/include/methods.h @@ -1,7 +1,7 @@ #ifndef METHODS_H #define METHODS_H -enum Methods { +enum METHODS { empty = 10, success = 100, ready = 110, From 5102ff1a88bb26486b42d634dd27734d91b2d9b1 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Thu, 26 Mar 2026 17:20:36 +0100 Subject: [PATCH 02/64] update: remove unnecessary log messages --- TabloMaster/src/utils/networking.cpp | 2 +- TabloMaster/src/utils/node_session_controller.cpp | 5 ----- TabloNode/src/utils/networking.cpp | 9 ++------- TabloNode/src/utils/worker.cpp | 1 - 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/TabloMaster/src/utils/networking.cpp b/TabloMaster/src/utils/networking.cpp index 95202f0..b4823d5 100644 --- a/TabloMaster/src/utils/networking.cpp +++ b/TabloMaster/src/utils/networking.cpp @@ -144,7 +144,7 @@ void Networking::handleClientConnection(int serverSocket, int clientSocket) { } } } - std::wcout << "[CLOSE] Connections with nodes that dont exist anymore" << std::endl; + // Close connections with nodes that dont exist anymore for (int index = 0; index < nodeIps.size(); index++) { std::wcout << "Iterating over nodeIPS" << std::endl; diff --git a/TabloMaster/src/utils/node_session_controller.cpp b/TabloMaster/src/utils/node_session_controller.cpp index f47b1ce..d7748a0 100644 --- a/TabloMaster/src/utils/node_session_controller.cpp +++ b/TabloMaster/src/utils/node_session_controller.cpp @@ -16,20 +16,15 @@ NodeSessionController::NodeSessionController() {} void NodeSessionController::sessionControllerCycle(int socket) { this->socket = socket; - std::wcout << "CYCLE STARTED" << std::endl; int responseCode = 0; - while (responseCode >= 0) { // Receive solutions tabnet::Packet solutionCount = tabnet::receiveMessage(socket); - std::wcout << "solutionCount " << solutionCount.method << " payload " << solutionCount.payload.c_str() << std::endl; if (solutionCount.method == METHODS::size) { responseCode = tabnet::sendMessage(socket, METHODS::success, ""); - for (int index = 0; index < std::stoi(solutionCount.payload); index++) { tabnet::Packet packet = tabnet::receiveMessage(socket); - std::wcout << "GOT SOLUTION -----> " << packet.method << std::endl; pushSolution(packet); responseCode = tabnet::sendMessage(socket, METHODS::success, ""); } diff --git a/TabloNode/src/utils/networking.cpp b/TabloNode/src/utils/networking.cpp index 6a4aa69..547a0aa 100644 --- a/TabloNode/src/utils/networking.cpp +++ b/TabloNode/src/utils/networking.cpp @@ -66,22 +66,17 @@ void Networking::handleClientConnection(int serverSocket, int clientSocket) { int responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); while (true) { - - // // -> Hand back finished solution + // Hand back finished solution int solutionCollectionSize = worker.getSolutionCollectionSize(); responseCode = tabnet::sendMessage(clientSocket, METHODS::size, std::to_string(solutionCollectionSize)); tabnet::Packet response = tabnet::receiveMessage(clientSocket); - std::wcout << solutionCollectionSize << "<--- size" << std::endl; if (response.method == METHODS::success) { for(int index = 0; index < solutionCollectionSize; index++) { // Send data tabnet::Packet solution = worker.getSolution(); - std::wcout << "Handing back solution" << solution.method << std::endl; responseCode = tabnet::sendPacket(clientSocket, solution); tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == METHODS::success) { - std::wcout << "Send succeded!" << std::endl; - } else { + if (response.method != METHODS::success) { std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; std::wcout << "With following payload" << response.payload.c_str() << std::endl; } diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 56edd5f..ae54cda 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -18,7 +18,6 @@ void Worker::solveOrderCycle() { switch (order.method) { case METHODS::test: - std::wcout << "TEST!" << std::endl; pushSolution(Worker::test(order)); break; From ab7e8531ca0e486267c190d9039ba3994758d9f0 Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 17:23:41 +0000 Subject: [PATCH 03/64] update: add ttp2 as flake input --- flake.lock | 37 ++++++++++++++++++++++++++++++++++++- flake.nix | 9 ++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/flake.lock b/flake.lock index fdb023c..b4cf7e4 100644 --- a/flake.lock +++ b/flake.lock @@ -16,9 +16,44 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1774386573, + "narHash": "sha256-4hAV26quOxdC6iyG7kYaZcM3VOskcPUrdCQd/nx8obc=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "46db2e09e1d3f113a13c0d7b81e2f221c63b8ce9", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "ttp2": "ttp2" + } + }, + "ttp2": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1777233202, + "narHash": "sha256-HJOsVaFAIrsZanayn3ZWY0fOdQ0SYaLO9i7wFElioO8=", + "owner": "Sobottasgithub", + "repo": "ttp2", + "rev": "352b32ee3cec2e29a054597d90353adea87c058b", + "type": "github" + }, + "original": { + "owner": "Sobottasgithub", + "repo": "ttp2", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index b0f0a9c..98f6eec 100644 --- a/flake.nix +++ b/flake.nix @@ -3,10 +3,17 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + ttp2 = { + url = "github:Sobottasgithub/ttp2"; + }; }; outputs = - { self, nixpkgs }: + { + self, + nixpkgs, + ttp2, + }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; From c1d67aca8f3b5bdb76cf13227565c36ee443bba8 Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 18:10:21 +0000 Subject: [PATCH 04/64] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'ttp2': 'github:Sobottasgithub/ttp2/352b32ee3cec2e29a054597d90353adea87c058b?narHash=sha256-HJOsVaFAIrsZanayn3ZWY0fOdQ0SYaLO9i7wFElioO8%3D' (2026-04-26) → 'github:Sobottasgithub/ttp2/d1a3b10474adb065395b7f508ec953e774d76a13?narHash=sha256-PTnhNzLTtT/BKjUlFbkZ/Vo1F/6e5SqbkFMATD/CzBQ%3D' (2026-05-14) --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index b4cf7e4..12f705a 100644 --- a/flake.lock +++ b/flake.lock @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1777233202, - "narHash": "sha256-HJOsVaFAIrsZanayn3ZWY0fOdQ0SYaLO9i7wFElioO8=", + "lastModified": 1778782072, + "narHash": "sha256-PTnhNzLTtT/BKjUlFbkZ/Vo1F/6e5SqbkFMATD/CzBQ=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "352b32ee3cec2e29a054597d90353adea87c058b", + "rev": "d1a3b10474adb065395b7f508ec953e774d76a13", "type": "github" }, "original": { From 4dd6a6be0162d5fc61146d443bd6963520b58caf Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 18:10:50 +0000 Subject: [PATCH 05/64] update: add libttp2 to build inputs --- flake.nix | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 98f6eec..194ba0c 100644 --- a/flake.nix +++ b/flake.nix @@ -20,15 +20,17 @@ version = "1.2"; + libttp2 = ttp2.packages.${system}.lib; + packages = with pkgs; [ cmake gcc gnumake protobuf + libttp2 ]; in { - packages.${system} = let tablo-full = pkgs.stdenv.mkDerivation { @@ -69,7 +71,7 @@ }; in { - inherit tablo-full; + inherit tablo-full libttp2; default = tablo-full; tablo-node-docker = mkTabloDocker "tablo-node" { }; tablo-master-docker = mkTabloDocker "tablo-master" { }; From 010c658f692b49d8211432ed42c94f433fff3a6f Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 18:32:54 +0000 Subject: [PATCH 06/64] update: link tablo against ttp2 --- CMakeLists.txt | 2 ++ TabloClient/CMakeLists.txt | 3 ++- TabloMaster/CMakeLists.txt | 3 ++- TabloNode/CMakeLists.txt | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e792c5f..478e021 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,8 @@ project(tablo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +find_library(ttp2 libttp2) + # Tablo shared libraries # libtabcrypt diff --git a/TabloClient/CMakeLists.txt b/TabloClient/CMakeLists.txt index b1ce592..2d2bfc0 100644 --- a/TabloClient/CMakeLists.txt +++ b/TabloClient/CMakeLists.txt @@ -8,8 +8,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h") add_executable(tablo-client ${SOURCES}) -# Link against the tabcrypt library +# Link against libs target_link_libraries(tablo-client PRIVATE tabcrypt) target_link_libraries(tablo-client PRIVATE tabnet) +target_link_libraries(tablo-client PRIVATE ttp2) install(TARGETS tablo-client DESTINATION bin) diff --git a/TabloMaster/CMakeLists.txt b/TabloMaster/CMakeLists.txt index a0c58e5..cdcf74a 100644 --- a/TabloMaster/CMakeLists.txt +++ b/TabloMaster/CMakeLists.txt @@ -8,8 +8,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h") add_executable(tablo-master ${SOURCES}) -# Link against the tabcrypt and tabnet library +# Link against libs target_link_libraries(tablo-master PRIVATE tabcrypt) target_link_libraries(tablo-master PRIVATE tabnet) +target_link_libraries(tablo-master PRIVATE ttp2) install(TARGETS tablo-master DESTINATION bin) diff --git a/TabloNode/CMakeLists.txt b/TabloNode/CMakeLists.txt index ed598d5..66cc93b 100644 --- a/TabloNode/CMakeLists.txt +++ b/TabloNode/CMakeLists.txt @@ -8,8 +8,9 @@ file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h") add_executable(tablo-node ${SOURCES}) -# Link against the tabcrypt and tabnet library +# Link against libs target_link_libraries(tablo-node PRIVATE tabcrypt) target_link_libraries(tablo-node PRIVATE tabnet) +target_link_libraries(tablo-node PRIVATE ttp2) install(TARGETS tablo-node DESTINATION bin) From 999b968f7cdea919c7a1dfac7bf4c1188978da60 Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 18:46:07 +0000 Subject: [PATCH 07/64] update: remove find_library instruction --- CMakeLists.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 478e021..e792c5f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,8 +4,6 @@ project(tablo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -find_library(ttp2 libttp2) - # Tablo shared libraries # libtabcrypt From cfe0a0a46d9fd8470202f4bcf86134ce11588325 Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 19:32:10 +0000 Subject: [PATCH 08/64] update: introduce new packages for subfolders --- CMakeLists.txt | 36 ++++++--- TCTest/CMakeLists.txt | 14 ---- TCTest/src/main.cpp | 50 ------------ TCTest/src/tabcrypt_test.h | 13 --- flake.nix | 159 +++++++++++++++++++++++++++++-------- 5 files changed, 151 insertions(+), 121 deletions(-) delete mode 100644 TCTest/CMakeLists.txt delete mode 100644 TCTest/src/main.cpp delete mode 100644 TCTest/src/tabcrypt_test.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e792c5f..081bcb9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,21 +4,35 @@ project(tablo) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -# Tablo shared libraries +# Build options -# libtabcrypt -add_subdirectory(lib/libtabcrypt) +option(DEF_LIBTABCRYPT "Build libtabcrypt" ON) +option(DEF_LIBTABNET "Build libtabnet" ON) -# libtabnet -add_subdirectory(lib/libtabnet) +option(DEF_CLIENT "Build TabloClient" ON) +option(DEF_MASTER "Build TabloMaster" ON) +option(DEF_NODE "Build TabloNode" ON) -# Test executables +# Shared libraries -add_subdirectory(TCTest) +if(DEF_LIBTABCRYPT) + add_subdirectory(lib/libtabcrypt) +endif() +if(DEF_LIBTABNET) + add_subdirectory(lib/libtabnet) +endif() -# TabloClient, TabloMaster and TabloNode executables (provided by own CMakeLists.txt files) +# Executables -add_subdirectory(TabloClient) -add_subdirectory(TabloMaster) -add_subdirectory(TabloNode) +if(DEF_CLIENT) + add_subdirectory(TabloClient) +endif() + +if(DEF_MASTER) + add_subdirectory(TabloMaster) +endif() + +if(DEF_NODE) + add_subdirectory(TabloNode) +endif() diff --git a/TCTest/CMakeLists.txt b/TCTest/CMakeLists.txt deleted file mode 100644 index 9eee444..0000000 --- a/TCTest/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -cmake_minimum_required(VERSION 3.10) -project(tablo) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -file(GLOB_RECURSE SOURCES "src/*.cpp" "src/*.h") - -add_executable(tabcrypt-test ${SOURCES}) - -# Link against the tabcrypt library -target_link_libraries(tabcrypt-test PRIVATE tabcrypt) - -install(TARGETS tabcrypt-test DESTINATION bin) diff --git a/TCTest/src/main.cpp b/TCTest/src/main.cpp deleted file mode 100644 index 3d7b702..0000000 --- a/TCTest/src/main.cpp +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include "tabcrypt_test.h" - - -void handleLine(const std::string& line) { - if (encrypt_mode) { - std::cout << tabcrypt::encrypt(line, secret) << "\n"; - } else { - try { - std::cout << tabcrypt::decrypt(line, secret) << "\n"; - } catch (const std::exception& e) { - std::cerr << "Decryption failed: " << e.what() << "\n"; - } - } -} - - -/* - * Arguments: - * tabcrypt_test [-d|-e] - * Messages via stdin/stdout - */ -int main(int argc, char *argv[]) { - if (argc < 2) { - std::cerr << "Usage: " << argv[0] << " [-d|-e]\n" - " -d: decrypt (default)\n" - " -e: encrypt\n"; - return EXIT_FAILURE; - }; - std::string secret = argv[1]; - - // parse argv[2] - - if (std::string(argv[2]) == "-e") { - encrypt_mode = true; - } else if (std::string(argv[2]) != "-d") { - std::cerr << "Unknown option: " << argv[2] << "\n"; - return EXIT_FAILURE; - } - - std::string line; - - while (std::getline(std::cin, line)) { - if (line.empty()) { - break; // Exit on empty line - } - handleLine(line); - } -} diff --git a/TCTest/src/tabcrypt_test.h b/TCTest/src/tabcrypt_test.h deleted file mode 100644 index 4762f02..0000000 --- a/TCTest/src/tabcrypt_test.h +++ /dev/null @@ -1,13 +0,0 @@ -// -// Created by Tureb on 22.07.2025. -// - -#ifndef TABCRYPT_TEST_H -#define TABCRYPT_TEST_H - -inline bool encrypt_mode = false; -inline std::string secret; - -void handleLine(const std::string& line); - -#endif //TABCRYPT_TEST_H diff --git a/flake.nix b/flake.nix index 194ba0c..254db0e 100644 --- a/flake.nix +++ b/flake.nix @@ -3,6 +3,7 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + ttp2 = { url = "github:Sobottasgithub/ttp2"; }; @@ -16,7 +17,10 @@ }: let system = "x86_64-linux"; - pkgs = import nixpkgs { inherit system; }; + + pkgs = import nixpkgs { + inherit system; + }; version = "1.2"; @@ -33,51 +37,139 @@ { packages.${system} = let - tablo-full = pkgs.stdenv.mkDerivation { - pname = "tablo-full"; - inherit version; - src = ./.; - - meta = { - description = "Full tablo package"; - mainProgram = "tablo-node"; + mkTabloPackage = + { + pname, + buildTarget, + + enableLibtabcrypt ? false, + enableLibtabnet ? false, + + enableNode ? false, + enableClient ? false, + enableMaster ? false, + + extraInputs ? [ ], + }: + pkgs.stdenv.mkDerivation { + inherit pname version; + + src = ./.; + + meta = { + description = "${pname} package"; + mainProgram = pname; + }; + + buildInputs = packages ++ extraInputs; + + configurePhase = '' + cmake -B build -S $src \ + -DCMAKE_BUILD_TYPE=Release \ + -DDEF_LIBTABCRYPT=${if enableLibtabcrypt then "ON" else "OFF"} \ + -DDEF_LIBTABNET=${if enableLibtabnet then "ON" else "OFF"} \ + -DDEF_NODE=${if enableNode then "ON" else "OFF"} \ + -DDEF_CLIENT=${if enableClient then "ON" else "OFF"} \ + -DDEF_MASTER=${if enableMaster then "ON" else "OFF"} + ''; + + buildPhase = '' + cmake --build build \ + --target ${buildTarget} \ + -j$NIX_BUILD_CORES + ''; + + installPhase = '' + cmake --install build --prefix=$out + cp LICENSE $out/ + ''; }; - buildInputs = packages; + libtabcrypt = mkTabloPackage { + pname = "libtabcrypt"; + buildTarget = "tabcrypt"; + + enableLibtabcrypt = true; + }; + + libtabnet = mkTabloPackage { + pname = "libtabnet"; + buildTarget = "tabnet"; + + enableLibtabnet = true; + + extraInputs = [ + libtabcrypt + # include libttp2 just here for later setup! + ]; + }; + + tablo-node = mkTabloPackage { + pname = "tablo-node"; + buildTarget = "TabloNode"; + + enableNode = true; + + extraInputs = [ + libtabcrypt + libtabnet + ]; + }; + + tablo-client = mkTabloPackage { + pname = "tablo-client"; + buildTarget = "TabloClient"; + + enableClient = true; + enableLibtabcrypt = true; + enableLibtabnet = true; - configurePhase = '' - cmake -B build -S $src -DCMAKE_BUILD_TYPE=Release - ''; + extraInputs = [ + libtabcrypt + libtabnet + ]; + }; + + tablo-master = mkTabloPackage { + pname = "tablo-master"; + buildTarget = "TabloMaster"; - buildPhase = '' - cmake --build build - ''; + enableMaster = true; + enableLibtabcrypt = true; + enableLibtabnet = true; - installPhase = '' - cmake --install build --prefix=$out - cp LICENSE $out/ - ''; + extraInputs = [ + libtabcrypt + libtabnet + ]; }; mkTabloDocker = - name: extraConfig: + package: binary: pkgs.dockerTools.buildImage { - inherit name; + name = binary; tag = version; + config = { - Cmd = [ "${tablo-full}/bin/${name}" ]; - } - // extraConfig; + Cmd = [ "${package}/bin/${binary}" ]; + }; }; in { - inherit tablo-full libttp2; - default = tablo-full; - tablo-node-docker = mkTabloDocker "tablo-node" { }; - tablo-master-docker = mkTabloDocker "tablo-master" { }; + inherit + tablo-node + tablo-client + tablo-master + libttp2 + ; - # used for client containers not deployed via swarm - tablo-client-docker = mkTabloDocker "tablo-client" { }; + default = tablo-node; + + tablo-node-docker = mkTabloDocker tablo-node "tablo-node"; + + tablo-master-docker = mkTabloDocker tablo-master "tablo-master"; + + tablo-client-docker = mkTabloDocker tablo-client "tablo-client"; }; devShells.${system}.default = @@ -91,13 +183,14 @@ pkgs.mkShell { packages = devPackages; - inputsFrom = [ self.packages.${system}.default ]; + inputsFrom = [ + self.packages.${system}.default + ]; shellHook = '' git status cmake -S . -B build -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ''; }; - }; } From 8e80ac03d8fc294ad2d6a6cb262b96bcf8459283 Mon Sep 17 00:00:00 2001 From: Ture Bentzin Date: Thu, 14 May 2026 19:40:00 +0000 Subject: [PATCH 09/64] update: introduce tablo default packages and tablo-full support --- flake.nix | 42 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/flake.nix b/flake.nix index 254db0e..6812b53 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,7 @@ inherit system; }; - version = "1.2"; + version = "1.3"; libttp2 = ttp2.packages.${system}.lib; @@ -40,7 +40,7 @@ mkTabloPackage = { pname, - buildTarget, + buildTarget ? pname, enableLibtabcrypt ? false, enableLibtabnet ? false, @@ -106,7 +106,6 @@ tablo-node = mkTabloPackage { pname = "tablo-node"; - buildTarget = "TabloNode"; enableNode = true; @@ -118,7 +117,6 @@ tablo-client = mkTabloPackage { pname = "tablo-client"; - buildTarget = "TabloClient"; enableClient = true; enableLibtabcrypt = true; @@ -132,7 +130,6 @@ tablo-master = mkTabloPackage { pname = "tablo-master"; - buildTarget = "TabloMaster"; enableMaster = true; enableLibtabcrypt = true; @@ -144,6 +141,35 @@ ]; }; + tablo-full = mkTabloPackage { + pname = "tablo-full"; + buildTarget = "all"; + + enableLibtabcrypt = true; + enableLibtabnet = true; + + enableNode = true; + enableClient = true; + enableMaster = true; + + extraInputs = [ + libtabcrypt + libtabnet + ]; + }; + + tablo = pkgs.symlinkJoin { + name = "tablo-${version}"; + + paths = [ + libtabcrypt + libtabnet + tablo-node + tablo-client + tablo-master + ]; + }; + mkTabloDocker = package: binary: pkgs.dockerTools.buildImage { @@ -157,13 +183,17 @@ in { inherit + tablo tablo-node tablo-client tablo-master + tablo-full + libtabcrypt + libtabnet libttp2 ; - default = tablo-node; + default = tablo; tablo-node-docker = mkTabloDocker tablo-node "tablo-node"; From c710ecb279aafc5b4e6266f4277ed9d0b9ecb0f4 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 15:33:50 +0200 Subject: [PATCH 10/64] update: update README with new build method --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 3471a24..804c917 100644 --- a/README.md +++ b/README.md @@ -14,11 +14,11 @@ The following ports are used to establish the network tablo needs: ### 2 Deploy ```cmd -nix shell -./build-image-nix.sh -tablo-master --interface YOURINTERFACE -tablo-node --interface YOURINTERFACE -tablo-client --master YOURMASTERSIP +sudo nix-collect-garbage -d +nix build --log-format bar-with-logs +nix run .#tablo-master -- --interface INTERFACENAME +nix run .#tablo-node -- --interface INTERFACENAME +nix run .#tablo-client -- --master MASTERIPV4 ``` ## Deploy with DOCKER From d1bf93fdaba3483abda9608ba8693b798ec81d31 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 15:47:26 +0200 Subject: [PATCH 11/64] update: remove tabnet --- build-proto.sh | 3 - lib/libtabnet/CMakeLists.txt | 29 +- lib/libtabnet/include/methods.h | 19 - lib/libtabnet/include/tabnet.h | 20 +- .../src/protobuf/transfer_protocol.pb.cc | 397 ----------------- .../src/protobuf/transfer_protocol.pb.h | 407 ------------------ .../src/protobuf/transfer_protocol.proto | 8 - lib/libtabnet/src/tabnet.cpp | 210 +-------- 8 files changed, 3 insertions(+), 1090 deletions(-) delete mode 100755 build-proto.sh delete mode 100644 lib/libtabnet/include/methods.h delete mode 100644 lib/libtabnet/src/protobuf/transfer_protocol.pb.cc delete mode 100644 lib/libtabnet/src/protobuf/transfer_protocol.pb.h delete mode 100644 lib/libtabnet/src/protobuf/transfer_protocol.proto diff --git a/build-proto.sh b/build-proto.sh deleted file mode 100755 index 31cdfcb..0000000 --- a/build-proto.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash - -protoc --cpp_out=./ lib/libtabnet/src/protobuf/transfer_protocol.proto diff --git a/lib/libtabnet/CMakeLists.txt b/lib/libtabnet/CMakeLists.txt index e142c7c..4749e00 100644 --- a/lib/libtabnet/CMakeLists.txt +++ b/lib/libtabnet/CMakeLists.txt @@ -4,39 +4,12 @@ project(tabnet) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) - -# find_library(protobuf protobuf) - -find_package(protobuf REQUIRED) - -include_directories( - include - ${Protobuf_INCLUDE_DIRS} -) - file(GLOB_RECURSE SOURCES "src/*.cpp") # file(GLOB_RECURSE HEADERS "include/*.h") - -set(PROTO_FILES - src/protobuf/transfer_protocol.proto -) - -add_library(tabnet SHARED ${SOURCES} ${PROTO_SRCS}) - -protobuf_generate( - TARGET tabnet - LANGUAGE cpp - OUT_VAR PROTO_SRCS - PROTOS ${PROTO_FILES} -) - +# target_include_directories(tabnet PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include - ${CMAKE_CURRENT_BINARY_DIR} # for protobuf ) -# Link against the tabcrypt and protobuf library -target_link_libraries(tabnet PRIVATE tabcrypt protobuf::libprotobuf) - install(TARGETS tabnet DESTINATION lib) install(DIRECTORY include/ DESTINATION include) diff --git a/lib/libtabnet/include/methods.h b/lib/libtabnet/include/methods.h deleted file mode 100644 index 1c5f6cb..0000000 --- a/lib/libtabnet/include/methods.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef METHODS_H -#define METHODS_H - -enum METHODS { - empty = 10, - success = 100, - ready = 110, - failed = 200, - ip = 300, - - START = 400, - test = 401, - size = 402, - response = 403, - setFile = 404, - END -}; - -#endif diff --git a/lib/libtabnet/include/tabnet.h b/lib/libtabnet/include/tabnet.h index 4c73827..4397666 100644 --- a/lib/libtabnet/include/tabnet.h +++ b/lib/libtabnet/include/tabnet.h @@ -1,24 +1,6 @@ #ifndef libtabnet #define libtabnet -#include -#include -#include - -namespace tabnet { - struct Packet { - int method; - std::string payload; - }; - - std::string getLocalIpAddress(std::string interface); - std::string getBroadcastIpAddress(); - int sendMessage(int socket, int method, std::string payload); - int sendPacket(int socket, tabnet::Packet packet); - int sendMessageTo(int socket, const sockaddr_in& broadcast, int method, std::string payload); - Packet receiveMessage(int socket); - bool isValidIpV4(std::string &ipString); - bool isNumeric(const std::string& string); -} +namespace tabnet {} #endif diff --git a/lib/libtabnet/src/protobuf/transfer_protocol.pb.cc b/lib/libtabnet/src/protobuf/transfer_protocol.pb.cc deleted file mode 100644 index 1b8c9e5..0000000 --- a/lib/libtabnet/src/protobuf/transfer_protocol.pb.cc +++ /dev/null @@ -1,397 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// NO CHECKED-IN PROTOBUF GENCODE -// source: lib/libtabnet/src/protobuf/transfer_protocol.proto -// Protobuf C++ Version: 6.31.1 - -#include "lib/libtabnet/src/protobuf/transfer_protocol.pb.h" - -#include -#include -#include "google/protobuf/io/coded_stream.h" -#include "google/protobuf/generated_message_tctable_impl.h" -#include "google/protobuf/extension_set.h" -#include "google/protobuf/generated_message_util.h" -#include "google/protobuf/wire_format_lite.h" -#include "google/protobuf/descriptor.h" -#include "google/protobuf/generated_message_reflection.h" -#include "google/protobuf/reflection_ops.h" -#include "google/protobuf/wire_format.h" -// @@protoc_insertion_point(includes) - -// Must be included last. -#include "google/protobuf/port_def.inc" -PROTOBUF_PRAGMA_INIT_SEG -namespace _pb = ::google::protobuf; -namespace _pbi = ::google::protobuf::internal; -namespace _fl = ::google::protobuf::internal::field_layout; -namespace transferprotocol { - -inline constexpr SerializedPacket::Impl_::Impl_( - ::_pbi::ConstantInitialized) noexcept - : _cached_size_{0}, - payload_( - &::google::protobuf::internal::fixed_address_empty_string, - ::_pbi::ConstantInitialized()), - method_{0} {} - -template -PROTOBUF_CONSTEXPR SerializedPacket::SerializedPacket(::_pbi::ConstantInitialized) -#if defined(PROTOBUF_CUSTOM_VTABLE) - : ::google::protobuf::Message(SerializedPacket_class_data_.base()), -#else // PROTOBUF_CUSTOM_VTABLE - : ::google::protobuf::Message(), -#endif // PROTOBUF_CUSTOM_VTABLE - _impl_(::_pbi::ConstantInitialized()) { -} -struct SerializedPacketDefaultTypeInternal { - PROTOBUF_CONSTEXPR SerializedPacketDefaultTypeInternal() : _instance(::_pbi::ConstantInitialized{}) {} - ~SerializedPacketDefaultTypeInternal() {} - union { - SerializedPacket _instance; - }; -}; - -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT - PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SerializedPacketDefaultTypeInternal _SerializedPacket_default_instance_; -} // namespace transferprotocol -static constexpr const ::_pb::EnumDescriptor *PROTOBUF_NONNULL *PROTOBUF_NULLABLE - file_level_enum_descriptors_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto = nullptr; -static constexpr const ::_pb::ServiceDescriptor *PROTOBUF_NONNULL *PROTOBUF_NULLABLE - file_level_service_descriptors_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto = nullptr; -const ::uint32_t - TableStruct_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto::offsets[] ABSL_ATTRIBUTE_SECTION_VARIABLE( - protodesc_cold) = { - 0x081, // bitmap - PROTOBUF_FIELD_OFFSET(::transferprotocol::SerializedPacket, _impl_._has_bits_), - 5, // hasbit index offset - PROTOBUF_FIELD_OFFSET(::transferprotocol::SerializedPacket, _impl_.method_), - PROTOBUF_FIELD_OFFSET(::transferprotocol::SerializedPacket, _impl_.payload_), - 1, - 0, -}; - -static const ::_pbi::MigrationSchema - schemas[] ABSL_ATTRIBUTE_SECTION_VARIABLE(protodesc_cold) = { - {0, sizeof(::transferprotocol::SerializedPacket)}, -}; -static const ::_pb::Message* PROTOBUF_NONNULL const file_default_instances[] = { - &::transferprotocol::_SerializedPacket_default_instance_._instance, -}; -const char descriptor_table_protodef_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto[] ABSL_ATTRIBUTE_SECTION_VARIABLE( - protodesc_cold) = { - "\n2lib/libtabnet/src/protobuf/transfer_pr" - "otocol.proto\022\020transferprotocol\"3\n\020Serial" - "izedPacket\022\016\n\006method\030\001 \001(\005\022\017\n\007payload\030\002 " - "\001(\tb\010editionsp\350\007" -}; -static ::absl::once_flag descriptor_table_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto_once; -PROTOBUF_CONSTINIT const ::_pbi::DescriptorTable descriptor_table_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto = { - false, - false, - 136, - descriptor_table_protodef_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto, - "lib/libtabnet/src/protobuf/transfer_protocol.proto", - &descriptor_table_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto_once, - nullptr, - 0, - 1, - schemas, - file_default_instances, - TableStruct_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto::offsets, - file_level_enum_descriptors_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto, - file_level_service_descriptors_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto, -}; -namespace transferprotocol { -// =================================================================== - -class SerializedPacket::_Internal { - public: - using HasBits = - decltype(::std::declval()._impl_._has_bits_); - static constexpr ::int32_t kHasBitsOffset = - 8 * PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_._has_bits_); -}; - -SerializedPacket::SerializedPacket(::google::protobuf::Arena* PROTOBUF_NULLABLE arena) -#if defined(PROTOBUF_CUSTOM_VTABLE) - : ::google::protobuf::Message(arena, SerializedPacket_class_data_.base()) { -#else // PROTOBUF_CUSTOM_VTABLE - : ::google::protobuf::Message(arena) { -#endif // PROTOBUF_CUSTOM_VTABLE - SharedCtor(arena); - // @@protoc_insertion_point(arena_constructor:transferprotocol.SerializedPacket) -} -PROTOBUF_NDEBUG_INLINE SerializedPacket::Impl_::Impl_( - ::google::protobuf::internal::InternalVisibility visibility, - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, - const ::transferprotocol::SerializedPacket& from_msg) - : _has_bits_{from._has_bits_}, - _cached_size_{0}, - payload_(arena, from.payload_) {} - -SerializedPacket::SerializedPacket( - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, - const SerializedPacket& from) -#if defined(PROTOBUF_CUSTOM_VTABLE) - : ::google::protobuf::Message(arena, SerializedPacket_class_data_.base()) { -#else // PROTOBUF_CUSTOM_VTABLE - : ::google::protobuf::Message(arena) { -#endif // PROTOBUF_CUSTOM_VTABLE - SerializedPacket* const _this = this; - (void)_this; - _internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>( - from._internal_metadata_); - new (&_impl_) Impl_(internal_visibility(), arena, from._impl_, from); - _impl_.method_ = from._impl_.method_; - - // @@protoc_insertion_point(copy_constructor:transferprotocol.SerializedPacket) -} -PROTOBUF_NDEBUG_INLINE SerializedPacket::Impl_::Impl_( - ::google::protobuf::internal::InternalVisibility visibility, - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) - : _cached_size_{0}, - payload_(arena) {} - -inline void SerializedPacket::SharedCtor(::_pb::Arena* PROTOBUF_NULLABLE arena) { - new (&_impl_) Impl_(internal_visibility(), arena); - _impl_.method_ = {}; -} -SerializedPacket::~SerializedPacket() { - // @@protoc_insertion_point(destructor:transferprotocol.SerializedPacket) - SharedDtor(*this); -} -inline void SerializedPacket::SharedDtor(MessageLite& self) { - SerializedPacket& this_ = static_cast(self); - this_._internal_metadata_.Delete<::google::protobuf::UnknownFieldSet>(); - ABSL_DCHECK(this_.GetArena() == nullptr); - this_._impl_.payload_.Destroy(); - this_._impl_.~Impl_(); -} - -inline void* PROTOBUF_NONNULL SerializedPacket::PlacementNew_( - const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena) { - return ::new (mem) SerializedPacket(arena); -} -constexpr auto SerializedPacket::InternalNewImpl_() { - return ::google::protobuf::internal::MessageCreator::CopyInit(sizeof(SerializedPacket), - alignof(SerializedPacket)); -} -constexpr auto SerializedPacket::InternalGenerateClassData_() { - return ::google::protobuf::internal::ClassDataFull{ - ::google::protobuf::internal::ClassData{ - &_SerializedPacket_default_instance_._instance, - &_table_.header, - nullptr, // OnDemandRegisterArenaDtor - nullptr, // IsInitialized - &SerializedPacket::MergeImpl, - ::google::protobuf::Message::GetNewImpl(), -#if defined(PROTOBUF_CUSTOM_VTABLE) - &SerializedPacket::SharedDtor, - ::google::protobuf::Message::GetClearImpl(), &SerializedPacket::ByteSizeLong, - &SerializedPacket::_InternalSerialize, -#endif // PROTOBUF_CUSTOM_VTABLE - PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_._cached_size_), - false, - }, - &SerializedPacket::kDescriptorMethods, - &descriptor_table_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto, - nullptr, // tracker - }; -} - -PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 const - ::google::protobuf::internal::ClassDataFull SerializedPacket_class_data_ = - SerializedPacket::InternalGenerateClassData_(); - -PROTOBUF_ATTRIBUTE_WEAK const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL -SerializedPacket::GetClassData() const { - ::google::protobuf::internal::PrefetchToLocalCache(&SerializedPacket_class_data_); - ::google::protobuf::internal::PrefetchToLocalCache(SerializedPacket_class_data_.tc_table); - return SerializedPacket_class_data_.base(); -} -PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 -const ::_pbi::TcParseTable<1, 2, 0, 49, 2> -SerializedPacket::_table_ = { - { - PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_._has_bits_), - 0, // no _extensions_ - 2, 8, // max_field_number, fast_idx_mask - offsetof(decltype(_table_), field_lookup_table), - 4294967292, // skipmap - offsetof(decltype(_table_), field_entries), - 2, // num_field_entries - 0, // num_aux_entries - offsetof(decltype(_table_), field_names), // no aux_entries - SerializedPacket_class_data_.base(), - nullptr, // post_loop_handler - ::_pbi::TcParser::GenericFallback, // fallback - #ifdef PROTOBUF_PREFETCH_PARSE_TABLE - ::_pbi::TcParser::GetTable<::transferprotocol::SerializedPacket>(), // to_prefetch - #endif // PROTOBUF_PREFETCH_PARSE_TABLE - }, {{ - // string payload = 2; - {::_pbi::TcParser::FastUS1, - {18, 0, 0, PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_.payload_)}}, - // int32 method = 1; - {::_pbi::TcParser::SingularVarintNoZag1<::uint32_t, offsetof(SerializedPacket, _impl_.method_), 1>(), - {8, 1, 0, PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_.method_)}}, - }}, {{ - 65535, 65535 - }}, {{ - // int32 method = 1; - {PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_.method_), _Internal::kHasBitsOffset + 1, 0, - (0 | ::_fl::kFcOptional | ::_fl::kInt32)}, - // string payload = 2; - {PROTOBUF_FIELD_OFFSET(SerializedPacket, _impl_.payload_), _Internal::kHasBitsOffset + 0, 0, - (0 | ::_fl::kFcOptional | ::_fl::kUtf8String | ::_fl::kRepAString)}, - }}, - // no aux_entries - {{ - "\41\0\7\0\0\0\0\0" - "transferprotocol.SerializedPacket" - "payload" - }}, -}; -PROTOBUF_NOINLINE void SerializedPacket::Clear() { -// @@protoc_insertion_point(message_clear_start:transferprotocol.SerializedPacket) - ::google::protobuf::internal::TSanWrite(&_impl_); - ::uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if ((cached_has_bits & 0x00000001u) != 0) { - _impl_.payload_.ClearNonDefaultToEmpty(); - } - _impl_.method_ = 0; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::google::protobuf::UnknownFieldSet>(); -} - -#if defined(PROTOBUF_CUSTOM_VTABLE) -::uint8_t* PROTOBUF_NONNULL SerializedPacket::_InternalSerialize( - const ::google::protobuf::MessageLite& base, ::uint8_t* PROTOBUF_NONNULL target, - ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) { - const SerializedPacket& this_ = static_cast(base); -#else // PROTOBUF_CUSTOM_VTABLE -::uint8_t* PROTOBUF_NONNULL SerializedPacket::_InternalSerialize( - ::uint8_t* PROTOBUF_NONNULL target, - ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { - const SerializedPacket& this_ = *this; -#endif // PROTOBUF_CUSTOM_VTABLE - // @@protoc_insertion_point(serialize_to_array_start:transferprotocol.SerializedPacket) - ::uint32_t cached_has_bits = 0; - (void)cached_has_bits; - - cached_has_bits = this_._impl_._has_bits_[0]; - // int32 method = 1; - if ((cached_has_bits & 0x00000002u) != 0) { - target = - ::google::protobuf::internal::WireFormatLite::WriteInt32ToArrayWithField<1>( - stream, this_._internal_method(), target); - } - - // string payload = 2; - if ((cached_has_bits & 0x00000001u) != 0) { - const ::std::string& _s = this_._internal_payload(); - ::google::protobuf::internal::WireFormatLite::VerifyUtf8String( - _s.data(), static_cast(_s.length()), ::google::protobuf::internal::WireFormatLite::SERIALIZE, "transferprotocol.SerializedPacket.payload"); - target = stream->WriteStringMaybeAliased(2, _s, target); - } - - if (ABSL_PREDICT_FALSE(this_._internal_metadata_.have_unknown_fields())) { - target = - ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - this_._internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:transferprotocol.SerializedPacket) - return target; -} - -#if defined(PROTOBUF_CUSTOM_VTABLE) -::size_t SerializedPacket::ByteSizeLong(const MessageLite& base) { - const SerializedPacket& this_ = static_cast(base); -#else // PROTOBUF_CUSTOM_VTABLE -::size_t SerializedPacket::ByteSizeLong() const { - const SerializedPacket& this_ = *this; -#endif // PROTOBUF_CUSTOM_VTABLE - // @@protoc_insertion_point(message_byte_size_start:transferprotocol.SerializedPacket) - ::size_t total_size = 0; - - ::uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void)cached_has_bits; - - ::_pbi::Prefetch5LinesFrom7Lines(&this_); - cached_has_bits = this_._impl_._has_bits_[0]; - if ((cached_has_bits & 0x00000003u) != 0) { - // string payload = 2; - if ((cached_has_bits & 0x00000001u) != 0) { - total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( - this_._internal_payload()); - } - // int32 method = 1; - if ((cached_has_bits & 0x00000002u) != 0) { - total_size += ::_pbi::WireFormatLite::Int32SizePlusOne( - this_._internal_method()); - } - } - return this_.MaybeComputeUnknownFieldsSize(total_size, - &this_._impl_._cached_size_); -} - -void SerializedPacket::MergeImpl(::google::protobuf::MessageLite& to_msg, const ::google::protobuf::MessageLite& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:transferprotocol.SerializedPacket) - ABSL_DCHECK_NE(&from, _this); - ::uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if ((cached_has_bits & 0x00000003u) != 0) { - if ((cached_has_bits & 0x00000001u) != 0) { - _this->_internal_set_payload(from._internal_payload()); - } - if ((cached_has_bits & 0x00000002u) != 0) { - _this->_impl_.method_ = from._impl_.method_; - } - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - _this->_internal_metadata_.MergeFrom<::google::protobuf::UnknownFieldSet>(from._internal_metadata_); -} - -void SerializedPacket::CopyFrom(const SerializedPacket& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:transferprotocol.SerializedPacket) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - - -void SerializedPacket::InternalSwap(SerializedPacket* PROTOBUF_RESTRICT PROTOBUF_NONNULL other) { - using ::std::swap; - auto* arena = GetArena(); - ABSL_DCHECK_EQ(arena, other->GetArena()); - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::_pbi::ArenaStringPtr::InternalSwap(&_impl_.payload_, &other->_impl_.payload_, arena); - swap(_impl_.method_, other->_impl_.method_); -} - -::google::protobuf::Metadata SerializedPacket::GetMetadata() const { - return ::google::protobuf::Message::GetMetadataImpl(GetClassData()->full()); -} -// @@protoc_insertion_point(namespace_scope) -} // namespace transferprotocol -namespace google { -namespace protobuf { -} // namespace protobuf -} // namespace google -// @@protoc_insertion_point(global_scope) -PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::std::false_type - _static_init2_ [[maybe_unused]] = - (::_pbi::AddDescriptors(&descriptor_table_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto), - ::std::false_type{}); -#include "google/protobuf/port_undef.inc" diff --git a/lib/libtabnet/src/protobuf/transfer_protocol.pb.h b/lib/libtabnet/src/protobuf/transfer_protocol.pb.h deleted file mode 100644 index 7e412c7..0000000 --- a/lib/libtabnet/src/protobuf/transfer_protocol.pb.h +++ /dev/null @@ -1,407 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// NO CHECKED-IN PROTOBUF GENCODE -// source: lib/libtabnet/src/protobuf/transfer_protocol.proto -// Protobuf C++ Version: 6.31.1 - -#ifndef lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto_2epb_2eh -#define lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto_2epb_2eh - -#include -#include -#include -#include - -#include "google/protobuf/runtime_version.h" -#if PROTOBUF_VERSION != 6031001 -#error "Protobuf C++ gencode is built with an incompatible version of" -#error "Protobuf C++ headers/runtime. See" -#error "https://protobuf.dev/support/cross-version-runtime-guarantee/#cpp" -#endif -#include "google/protobuf/io/coded_stream.h" -#include "google/protobuf/arena.h" -#include "google/protobuf/arenastring.h" -#include "google/protobuf/generated_message_tctable_decl.h" -#include "google/protobuf/generated_message_util.h" -#include "google/protobuf/metadata_lite.h" -#include "google/protobuf/generated_message_reflection.h" -#include "google/protobuf/message.h" -#include "google/protobuf/message_lite.h" -#include "google/protobuf/repeated_field.h" // IWYU pragma: export -#include "google/protobuf/extension_set.h" // IWYU pragma: export -#include "google/protobuf/unknown_field_set.h" -// @@protoc_insertion_point(includes) - -// Must be included last. -#include "google/protobuf/port_def.inc" - -#define PROTOBUF_INTERNAL_EXPORT_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto - -namespace google { -namespace protobuf { -namespace internal { -template -::absl::string_view GetAnyMessageName(); -} // namespace internal -} // namespace protobuf -} // namespace google - -// Internal implementation detail -- do not use these members. -struct TableStruct_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto { - static const ::uint32_t offsets[]; -}; -extern "C" { -extern const ::google::protobuf::internal::DescriptorTable descriptor_table_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto; -} // extern "C" -namespace transferprotocol { -class SerializedPacket; -struct SerializedPacketDefaultTypeInternal; -extern SerializedPacketDefaultTypeInternal _SerializedPacket_default_instance_; -extern const ::google::protobuf::internal::ClassDataFull SerializedPacket_class_data_; -} // namespace transferprotocol -namespace google { -namespace protobuf { -} // namespace protobuf -} // namespace google - -namespace transferprotocol { - -// =================================================================== - - -// ------------------------------------------------------------------- - -class SerializedPacket final : public ::google::protobuf::Message -/* @@protoc_insertion_point(class_definition:transferprotocol.SerializedPacket) */ { - public: - inline SerializedPacket() : SerializedPacket(nullptr) {} - ~SerializedPacket() PROTOBUF_FINAL; - -#if defined(PROTOBUF_CUSTOM_VTABLE) - void operator delete(SerializedPacket* PROTOBUF_NONNULL msg, std::destroying_delete_t) { - SharedDtor(*msg); - ::google::protobuf::internal::SizedDelete(msg, sizeof(SerializedPacket)); - } -#endif - - template - explicit PROTOBUF_CONSTEXPR SerializedPacket(::google::protobuf::internal::ConstantInitialized); - - inline SerializedPacket(const SerializedPacket& from) : SerializedPacket(nullptr, from) {} - inline SerializedPacket(SerializedPacket&& from) noexcept - : SerializedPacket(nullptr, ::std::move(from)) {} - inline SerializedPacket& operator=(const SerializedPacket& from) { - CopyFrom(from); - return *this; - } - inline SerializedPacket& operator=(SerializedPacket&& from) noexcept { - if (this == &from) return *this; - if (::google::protobuf::internal::CanMoveWithInternalSwap(GetArena(), from.GetArena())) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - return _internal_metadata_.unknown_fields<::google::protobuf::UnknownFieldSet>(::google::protobuf::UnknownFieldSet::default_instance); - } - inline ::google::protobuf::UnknownFieldSet* PROTOBUF_NONNULL mutable_unknown_fields() - ABSL_ATTRIBUTE_LIFETIME_BOUND { - return _internal_metadata_.mutable_unknown_fields<::google::protobuf::UnknownFieldSet>(); - } - - static const ::google::protobuf::Descriptor* PROTOBUF_NONNULL descriptor() { - return GetDescriptor(); - } - static const ::google::protobuf::Descriptor* PROTOBUF_NONNULL GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::google::protobuf::Reflection* PROTOBUF_NONNULL GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const SerializedPacket& default_instance() { - return *reinterpret_cast( - &_SerializedPacket_default_instance_); - } - static constexpr int kIndexInFileMessages = 0; - friend void swap(SerializedPacket& a, SerializedPacket& b) { a.Swap(&b); } - inline void Swap(SerializedPacket* PROTOBUF_NONNULL other) { - if (other == this) return; - if (::google::protobuf::internal::CanUseInternalSwap(GetArena(), other->GetArena())) { - InternalSwap(other); - } else { - ::google::protobuf::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(SerializedPacket* PROTOBUF_NONNULL other) { - if (other == this) return; - ABSL_DCHECK(GetArena() == other->GetArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - SerializedPacket* PROTOBUF_NONNULL New(::google::protobuf::Arena* PROTOBUF_NULLABLE arena = nullptr) const { - return ::google::protobuf::Message::DefaultConstruct(arena); - } - using ::google::protobuf::Message::CopyFrom; - void CopyFrom(const SerializedPacket& from); - using ::google::protobuf::Message::MergeFrom; - void MergeFrom(const SerializedPacket& from) { SerializedPacket::MergeImpl(*this, from); } - - private: - static void MergeImpl(::google::protobuf::MessageLite& to_msg, - const ::google::protobuf::MessageLite& from_msg); - - public: - bool IsInitialized() const { - return true; - } - ABSL_ATTRIBUTE_REINITIALIZES void Clear() PROTOBUF_FINAL; - #if defined(PROTOBUF_CUSTOM_VTABLE) - private: - static ::size_t ByteSizeLong(const ::google::protobuf::MessageLite& msg); - static ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( - const ::google::protobuf::MessageLite& msg, ::uint8_t* PROTOBUF_NONNULL target, - ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream); - - public: - ::size_t ByteSizeLong() const { return ByteSizeLong(*this); } - ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( - ::uint8_t* PROTOBUF_NONNULL target, - ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const { - return _InternalSerialize(*this, target, stream); - } - #else // PROTOBUF_CUSTOM_VTABLE - ::size_t ByteSizeLong() const final; - ::uint8_t* PROTOBUF_NONNULL _InternalSerialize( - ::uint8_t* PROTOBUF_NONNULL target, - ::google::protobuf::io::EpsCopyOutputStream* PROTOBUF_NONNULL stream) const final; - #endif // PROTOBUF_CUSTOM_VTABLE - int GetCachedSize() const { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); - static void SharedDtor(MessageLite& self); - void InternalSwap(SerializedPacket* PROTOBUF_NONNULL other); - private: - template - friend ::absl::string_view(::google::protobuf::internal::GetAnyMessageName)(); - static ::absl::string_view FullMessageName() { return "transferprotocol.SerializedPacket"; } - - protected: - explicit SerializedPacket(::google::protobuf::Arena* PROTOBUF_NULLABLE arena); - SerializedPacket(::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const SerializedPacket& from); - SerializedPacket( - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, SerializedPacket&& from) noexcept - : SerializedPacket(arena) { - *this = ::std::move(from); - } - const ::google::protobuf::internal::ClassData* PROTOBUF_NONNULL GetClassData() const PROTOBUF_FINAL; - static void* PROTOBUF_NONNULL PlacementNew_( - const void* PROTOBUF_NONNULL, void* PROTOBUF_NONNULL mem, - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); - static constexpr auto InternalNewImpl_(); - - public: - static constexpr auto InternalGenerateClassData_(); - - ::google::protobuf::Metadata GetMetadata() const; - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - enum : int { - kPayloadFieldNumber = 2, - kMethodFieldNumber = 1, - }; - // string payload = 2; - bool has_payload() const; - void clear_payload() ; - const ::std::string& payload() const; - template - void set_payload(Arg_&& arg, Args_... args); - ::std::string* PROTOBUF_NONNULL mutable_payload(); - [[nodiscard]] ::std::string* PROTOBUF_NULLABLE release_payload(); - void set_allocated_payload(::std::string* PROTOBUF_NULLABLE value); - - private: - const ::std::string& _internal_payload() const; - PROTOBUF_ALWAYS_INLINE void _internal_set_payload(const ::std::string& value); - ::std::string* PROTOBUF_NONNULL _internal_mutable_payload(); - - public: - // int32 method = 1; - bool has_method() const; - void clear_method() ; - ::int32_t method() const; - void set_method(::int32_t value); - - private: - ::int32_t _internal_method() const; - void _internal_set_method(::int32_t value); - - public: - // @@protoc_insertion_point(class_scope:transferprotocol.SerializedPacket) - private: - class _Internal; - friend class ::google::protobuf::internal::TcParser; - static const ::google::protobuf::internal::TcParseTable<1, 2, - 0, 49, - 2> - _table_; - - friend class ::google::protobuf::MessageLite; - friend class ::google::protobuf::Arena; - template - friend class ::google::protobuf::Arena::InternalHelper; - using InternalArenaConstructable_ = void; - using DestructorSkippable_ = void; - struct Impl_ { - inline explicit constexpr Impl_(::google::protobuf::internal::ConstantInitialized) noexcept; - inline explicit Impl_( - ::google::protobuf::internal::InternalVisibility visibility, - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena); - inline explicit Impl_( - ::google::protobuf::internal::InternalVisibility visibility, - ::google::protobuf::Arena* PROTOBUF_NULLABLE arena, const Impl_& from, - const SerializedPacket& from_msg); - ::google::protobuf::internal::HasBits<1> _has_bits_; - ::google::protobuf::internal::CachedSize _cached_size_; - ::google::protobuf::internal::ArenaStringPtr payload_; - ::int32_t method_; - PROTOBUF_TSAN_DECLARE_MEMBER - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto; -}; - -extern const ::google::protobuf::internal::ClassDataFull SerializedPacket_class_data_; - -// =================================================================== - - - - -// =================================================================== - - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif // __GNUC__ -// ------------------------------------------------------------------- - -// SerializedPacket - -// int32 method = 1; -inline bool SerializedPacket::has_method() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline void SerializedPacket::clear_method() { - ::google::protobuf::internal::TSanWrite(&_impl_); - _impl_.method_ = 0; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline ::int32_t SerializedPacket::method() const { - // @@protoc_insertion_point(field_get:transferprotocol.SerializedPacket.method) - return _internal_method(); -} -inline void SerializedPacket::set_method(::int32_t value) { - _internal_set_method(value); - _impl_._has_bits_[0] |= 0x00000002u; - // @@protoc_insertion_point(field_set:transferprotocol.SerializedPacket.method) -} -inline ::int32_t SerializedPacket::_internal_method() const { - ::google::protobuf::internal::TSanRead(&_impl_); - return _impl_.method_; -} -inline void SerializedPacket::_internal_set_method(::int32_t value) { - ::google::protobuf::internal::TSanWrite(&_impl_); - _impl_.method_ = value; -} - -// string payload = 2; -inline bool SerializedPacket::has_payload() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline void SerializedPacket::clear_payload() { - ::google::protobuf::internal::TSanWrite(&_impl_); - _impl_.payload_.ClearToEmpty(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const ::std::string& SerializedPacket::payload() const - ABSL_ATTRIBUTE_LIFETIME_BOUND { - // @@protoc_insertion_point(field_get:transferprotocol.SerializedPacket.payload) - return _internal_payload(); -} -template -PROTOBUF_ALWAYS_INLINE void SerializedPacket::set_payload(Arg_&& arg, Args_... args) { - ::google::protobuf::internal::TSanWrite(&_impl_); - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.payload_.Set(static_cast(arg), args..., GetArena()); - // @@protoc_insertion_point(field_set:transferprotocol.SerializedPacket.payload) -} -inline ::std::string* PROTOBUF_NONNULL SerializedPacket::mutable_payload() - ABSL_ATTRIBUTE_LIFETIME_BOUND { - ::std::string* _s = _internal_mutable_payload(); - // @@protoc_insertion_point(field_mutable:transferprotocol.SerializedPacket.payload) - return _s; -} -inline const ::std::string& SerializedPacket::_internal_payload() const { - ::google::protobuf::internal::TSanRead(&_impl_); - return _impl_.payload_.Get(); -} -inline void SerializedPacket::_internal_set_payload(const ::std::string& value) { - ::google::protobuf::internal::TSanWrite(&_impl_); - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.payload_.Set(value, GetArena()); -} -inline ::std::string* PROTOBUF_NONNULL SerializedPacket::_internal_mutable_payload() { - ::google::protobuf::internal::TSanWrite(&_impl_); - _impl_._has_bits_[0] |= 0x00000001u; - return _impl_.payload_.Mutable( GetArena()); -} -inline ::std::string* PROTOBUF_NULLABLE SerializedPacket::release_payload() { - ::google::protobuf::internal::TSanWrite(&_impl_); - // @@protoc_insertion_point(field_release:transferprotocol.SerializedPacket.payload) - if ((_impl_._has_bits_[0] & 0x00000001u) == 0) { - return nullptr; - } - _impl_._has_bits_[0] &= ~0x00000001u; - auto* released = _impl_.payload_.Release(); - if (::google::protobuf::internal::DebugHardenForceCopyDefaultString()) { - _impl_.payload_.Set("", GetArena()); - } - return released; -} -inline void SerializedPacket::set_allocated_payload(::std::string* PROTOBUF_NULLABLE value) { - ::google::protobuf::internal::TSanWrite(&_impl_); - if (value != nullptr) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.payload_.SetAllocated(value, GetArena()); - if (::google::protobuf::internal::DebugHardenForceCopyDefaultString() && _impl_.payload_.IsDefault()) { - _impl_.payload_.Set("", GetArena()); - } - // @@protoc_insertion_point(field_set_allocated:transferprotocol.SerializedPacket.payload) -} - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif // __GNUC__ - -// @@protoc_insertion_point(namespace_scope) -} // namespace transferprotocol - - -// @@protoc_insertion_point(global_scope) - -#include "google/protobuf/port_undef.inc" - -#endif // lib_2flibtabnet_2fsrc_2fprotobuf_2ftransfer_5fprotocol_2eproto_2epb_2eh diff --git a/lib/libtabnet/src/protobuf/transfer_protocol.proto b/lib/libtabnet/src/protobuf/transfer_protocol.proto deleted file mode 100644 index cfd80f4..0000000 --- a/lib/libtabnet/src/protobuf/transfer_protocol.proto +++ /dev/null @@ -1,8 +0,0 @@ -edition = "2023"; - -package transferprotocol; - -message SerializedPacket { - int32 method = 1; - string payload = 2; -} diff --git a/lib/libtabnet/src/tabnet.cpp b/lib/libtabnet/src/tabnet.cpp index 16143a1..6c133e1 100644 --- a/lib/libtabnet/src/tabnet.cpp +++ b/lib/libtabnet/src/tabnet.cpp @@ -1,211 +1,3 @@ #include "../include/tabnet.h" -#include "tabcrypt.h" -#include "methods.h" -#include "protobuf/transfer_protocol.pb.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -std::string secret = ""; - -namespace tabnet { - std::string getLocalIpAddress(std::string interface) { - struct ifaddrs *ifaddr = nullptr; - - // Get linked list of network interfaces - if (getifaddrs(&ifaddr) == -1) { - return ""; - } - - std::string result; - - // Iterate through interfaces - for (auto *ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) { - if (!ifa->ifa_addr) continue; - - if (ifa->ifa_addr->sa_family == AF_INET) { - auto *addr = reinterpret_cast(ifa->ifa_addr); - char ip[INET_ADDRSTRLEN]; - inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip)); - - // Docker containers typically use eth0 - if (std::string(ifa->ifa_name) == interface) { - result = ip; - break; - } - } - } - - freeifaddrs(ifaddr); - return result; - } - - std::string getBroadcastIpAddress() { - struct ifaddrs* ifaddr = nullptr; - std::string broadcastIP; - - // Get network interfaces - if (getifaddrs(&ifaddr) == -1) { - return ""; - } - - for (struct ifaddrs* ifa = ifaddr; ifa != nullptr; ifa = ifa->ifa_next) { - if (ifa->ifa_addr == nullptr) continue; - - // Only consider IPv4 interfaces that are up and support broadcast - if (ifa->ifa_addr->sa_family == AF_INET && - (ifa->ifa_flags & IFF_BROADCAST) && - (ifa->ifa_flags & IFF_UP) && - !(ifa->ifa_flags & IFF_LOOPBACK)) { - - // Ensure the broadcast address exists - if (ifa->ifa_broadaddr) { - struct sockaddr_in* bcast = - reinterpret_cast(ifa->ifa_broadaddr); - char ip[INET_ADDRSTRLEN]; - if (inet_ntop(AF_INET, &(bcast->sin_addr), ip, INET_ADDRSTRLEN)) { - broadcastIP = ip; - break; // stop at the first valid one - } - } - } - } - - freeifaddrs(ifaddr); - return broadcastIP; - } - - int sendPacket(int socket, tabnet::Packet packet) { - return sendMessage(socket, packet.method, packet.payload); - } - - int sendMessage(int socket, int method, std::string payload) { - transferprotocol::SerializedPacket serializedData; - serializedData.set_method(method); - serializedData.set_payload(payload); - - size_t size = serializedData.ByteSizeLong(); - void *buffer = malloc(size); - serializedData.SerializeToArray(buffer, size); - - //std::string encryptedMessage = tabcrypt::encrypt(secret, data); - std::string stringSize = std::to_string(size); - - // Size has to be 8! - ssize_t s = send(socket, stringSize.c_str(), 8, MSG_NOSIGNAL); - ssize_t n = send(socket, buffer, size, MSG_NOSIGNAL); - if (n < 0) { - if (errno == EPIPE || errno == ECONNRESET) { - return -1; - } - } - return 0; - } - - int sendMessageTo(int socket, const sockaddr_in& broadcast, int method, std::string payload) { - transferprotocol::SerializedPacket serializedData; - serializedData.set_method(method); - serializedData.set_payload(payload); - - size_t size = serializedData.ByteSizeLong(); - void *buffer = malloc(size); - serializedData.SerializeToArray(buffer, size); - - std::string stringSize = std::to_string(size); - - if (sendto(socket, stringSize.c_str(), 8, 0, (struct sockaddr*)&broadcast, sizeof(broadcast)) < 0) { - std::wcout << "size: Sendto Failed!" << std::endl; - return -1; - } - - if (sendto(socket, buffer, size, 0, (struct sockaddr*)&broadcast, sizeof(broadcast)) < 0) { - std::wcout << "buffer: Sendto Failed!" << std::endl; - return -1; - } - - return 0; - } - - Packet receiveMessage(int socket) { - std::string dataString; - transferprotocol::SerializedPacket SerializedData; - Packet data; - - pollfd pfd{}; - pfd.fd = socket; - pfd.events = POLLIN; - - int ret = poll(&pfd, 1, 10000); - - int bufferSize = 1024; - if (ret > 0 && (pfd.revents & POLLIN)) { - char bufferSizeChar[8] = { 0 }; - ssize_t tempSize = recv(socket, bufferSizeChar, sizeof(bufferSizeChar), 0); - if (isNumeric(bufferSizeChar)) { - bufferSize = std::stoi(bufferSizeChar); - } else { - std::wcout << "ReceiveMessage: Error: Bytes are not numeric!" << std::endl; - } - } - - if (ret > 0 && (pfd.revents & POLLIN)) { - char* buffer = new char[bufferSize]; - ssize_t size = recv(socket, buffer, bufferSize, 0); - SerializedData.ParseFromArray(buffer, size); - - data = {SerializedData.method(), SerializedData.payload()}; - - if (size <= 0) return data; - return data; - } - return data; - } - - bool isValidIpV4(std::string &ipString){ - if (ipString.size() < 7) return false; - - int count = 0; - // Seperate Ip Octets - std::stringstream stringStream(ipString); - while (stringStream.good()){ - std::string octet; - getline(stringStream, octet, '.'); - - if (octet.size() > 1){ - if (octet[0] == '0') - return false; - } - - for (int index = 0; index < octet.size(); index++){ - if (isalpha(octet[index])) - return false; - } - - if (stoi(octet) > 255) - return false; - - count++; - } - - if (count != 4) return false; - - return true; - } - - bool isNumeric(const std::string& string) { - static const std::regex numberRegex( - R"(^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?$)" - ); - return std::regex_match(string, numberRegex); - } -} +namespace tabnet {} From 0e82457c5b8ad1ff90df03f1d1baade5c9155460 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 16:09:55 +0200 Subject: [PATCH 12/64] update: remove old tablo code from TabloClient and TabloMaster --- TabloClient/src/utils/cli.cpp | 9 +- TabloClient/src/utils/networking.cpp | 81 -------- TabloMaster/src/tabloMaster.cpp | 3 - .../src/utils/client_session_controller.cpp | 93 --------- .../src/utils/client_session_controller.h | 30 --- TabloMaster/src/utils/networking.cpp | 183 +----------------- TabloMaster/src/utils/networking.h | 26 +-- .../src/utils/node_session_controller.cpp | 114 ----------- .../src/utils/node_session_controller.h | 32 --- TabloMaster/src/utils/udp_discovery.cpp | 5 +- lib/libtabnet/CMakeLists.txt | 10 +- 11 files changed, 18 insertions(+), 568 deletions(-) delete mode 100644 TabloMaster/src/utils/client_session_controller.cpp delete mode 100644 TabloMaster/src/utils/client_session_controller.h delete mode 100644 TabloMaster/src/utils/node_session_controller.cpp delete mode 100644 TabloMaster/src/utils/node_session_controller.h diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 19238b4..d5c493e 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -1,9 +1,7 @@ #include "cli.h" -#include #include #include -#include #include #include "networking.h" @@ -19,17 +17,12 @@ Cli::Cli(std::string tabloMaster) { ); while (true) { - int method; - std::wcout << "Method: "; - std::cin >> method; - std::wcout << std::endl; - std::string content; std::wcout << "Content: "; std::cin >> content; std::wcout << std::endl; - networking.pushOrder(method, content); + networking.pushOrder(1, content); std::wcout << "Waiting for solution..." << std::endl; while (!networking.hasSolution()) {} // Wait for solution diff --git a/TabloClient/src/utils/networking.cpp b/TabloClient/src/utils/networking.cpp index e58d884..3400799 100644 --- a/TabloClient/src/utils/networking.cpp +++ b/TabloClient/src/utils/networking.cpp @@ -1,84 +1,10 @@ #include "networking.h" #include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tabnet.h" -#include "methods.h" Networking::Networking() {} void Networking::networkingCycle(std::string tabloMaster) { - // creating socket - int clientSocket = socket(AF_INET, SOCK_STREAM, 0); - - // specifying address - sockaddr_in serverAddress; - serverAddress.sin_family = AF_INET; - serverAddress.sin_port = htons(4003); - serverAddress.sin_addr.s_addr = inet_addr(tabloMaster.c_str()); - - // sending connection request - connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)); - - while(true) { - int orderCollectionSize = orderCollection.size(); - tabnet::sendMessage(clientSocket, METHODS::size, std::to_string(orderCollectionSize)); - tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == METHODS::success) { - for(int index = 0; index < orderCollectionSize; index++) { - std::map order = orderCollection[0]; - orderCollection.erase(orderCollection.begin()); - int method = order.begin()->first; - - // Send data - tabnet::sendMessage(clientSocket, method, order[method]); - tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == METHODS::success) { - std::wcout << "Send succeded!" << std::endl; - } else { - std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; - std::wcout << "With following payload" << response.payload.c_str() << std::endl; - } - } - } else if (response.method == METHODS::failed) { - std::wcout << "Something went wrong while sending the size! Master response: " << response.payload.c_str() << std::endl; - } else { - std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; - std::wcout << "With following payload" << response.payload.c_str() << std::endl; - } - - //receive - tabnet::Packet receivedPacket = tabnet::receiveMessage(clientSocket); - if (receivedPacket.method == METHODS::size) { - int count = std::stoi(receivedPacket.payload); - if (count != 0) { - tabnet::sendMessage(clientSocket, METHODS::success, ""); - for(int i = 0; i < count; i++) { - tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == METHODS::response) { - solutionCollection.push_back(response.payload); - tabnet::sendMessage(clientSocket, METHODS::success, ""); - } else { - std::wcout << "Expected: " << METHODS::response << " (response) got: " << receivedPacket.method << std::endl; - tabnet::sendMessage(clientSocket, METHODS::failed, "Expected method response"); - } - } - } - } else { - std::wcout << "Expected: " << METHODS::size << " (size) got: " << receivedPacket.method << std::endl; - tabnet::sendMessage(clientSocket, METHODS::failed, "Expected method size"); - } - } } bool Networking::hasSolution() { @@ -100,10 +26,3 @@ void Networking::pushOrder(int method, std::string content) { orderCollection.push_back(order); } -bool Networking::isNumeric(const std::string& string) { - static const std::regex number_regex( - R"(^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?$)" - ); - return std::regex_match(string, number_regex); -} - diff --git a/TabloMaster/src/tabloMaster.cpp b/TabloMaster/src/tabloMaster.cpp index 7c2aeb6..049e293 100644 --- a/TabloMaster/src/tabloMaster.cpp +++ b/TabloMaster/src/tabloMaster.cpp @@ -5,9 +5,6 @@ int main(int argc, char *argv[]) { - // Prevents crash when tcp send failes - signal(SIGPIPE, SIG_IGN); - std::wcout << "Tablo Master" << std::endl; if (argc > 0) { for(int index = 0; index < argc; index++) { diff --git a/TabloMaster/src/utils/client_session_controller.cpp b/TabloMaster/src/utils/client_session_controller.cpp deleted file mode 100644 index 33c0c93..0000000 --- a/TabloMaster/src/utils/client_session_controller.cpp +++ /dev/null @@ -1,93 +0,0 @@ -#include "client_session_controller.h" - -#include "tabnet.h" -#include "methods.h" - -#include -#include -#include -#include -#include -#include -#include - -ClientSessionManager::ClientSessionManager() {} - -ClientSessionManager::ClientSessionManager(int socket) { - setSocket(socket); -} - -void ClientSessionManager::setSocket(int socket) { - this->socket = socket; -} - -void ClientSessionManager::sessionControllerCycle() { - int responseCode = 0; - - while (responseCode >= 0) { - // Recieve orders - tabnet::Packet orderCount = tabnet::receiveMessage(this->socket); - if (orderCount.method == METHODS::size) { - responseCode = tabnet::sendMessage(this->socket, METHODS::success, ""); - - for (int index = 0; index < std::stoi(orderCount.payload); index++) { - orderCollection.push_back(tabnet::receiveMessage(this->socket)); - responseCode = tabnet::sendMessage(this->socket, METHODS::success, ""); - } - } else { - responseCode = tabnet::sendMessage(this->socket, METHODS::failed, ""); - std::wcout << "Something went wrong during receiving size!" << std::endl; - std::wcout << "Got: " << orderCount.method << " instead of " << METHODS::size << " (size)" << std::endl; - } - - // Send solutions - int solutionCollectionSize = solutionCollection.size(); - responseCode = tabnet::sendMessage(this->socket, METHODS::size, std::to_string(solutionCollectionSize)); - if (solutionCollectionSize > 0) { - if (tabnet::receiveMessage(this->socket).method == METHODS::success) { - for(int index = 0; index < solutionCollectionSize; index++) { - responseCode = tabnet::sendMessage(this->socket, solutionCollection[0].method, solutionCollection[0].payload); - if (tabnet::receiveMessage(this->socket).method == METHODS::success) { - solutionCollection.erase(solutionCollection.begin()); - } else { - std::wcout << "Send of solution failed!" << std::endl; - } - } - } else { - std::wcout << "Send of size failed!" << std::endl; - } - } - } - connected = false; -} - -bool ClientSessionManager::hasOrder() { - std::lock_guard lock(mtx); - return !orderCollection.empty(); -} - -bool ClientSessionManager::isConnected() { - std::lock_guard lock(mtx); - return connected; -} - -tabnet::Packet ClientSessionManager::popOrder() { - std::lock_guard lock(mtx); - if (!orderCollection.empty()) { - tabnet::Packet firstOrder = orderCollection[0]; - orderCollection.erase(orderCollection.begin()); - return firstOrder; - } - tabnet::Packet emptyPacket; - return emptyPacket; -} - -void ClientSessionManager::pushSolution(tabnet::Packet solution) { - std::lock_guard lock(mtx); - solutionCollection.push_back(solution); -} - -int ClientSessionManager::getOrderCollectionSize() { - std::lock_guard lock(mtx); - return orderCollection.size(); -} diff --git a/TabloMaster/src/utils/client_session_controller.h b/TabloMaster/src/utils/client_session_controller.h deleted file mode 100644 index 411a010..0000000 --- a/TabloMaster/src/utils/client_session_controller.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef CLIENT_SESSION_CONTROLLER_H -#define CLIENT_SESSION_CONTROLLER_H - -#include -#include -#include -#include "tabnet.h" - -class ClientSessionManager -{ - public: - ClientSessionManager(); - ClientSessionManager(int socket); - void sessionControllerCycle(); - bool isConnected(); - bool hasOrder(); - tabnet::Packet popOrder(); - int getOrderCollectionSize(); - void pushSolution(tabnet::Packet); - void setSocket(int socket); - - private: - int socket; - std::vector orderCollection; - std::vector solutionCollection; - bool connected = true; - std::mutex mtx; -}; - -#endif diff --git a/TabloMaster/src/utils/networking.cpp b/TabloMaster/src/utils/networking.cpp index b4823d5..9095668 100644 --- a/TabloMaster/src/utils/networking.cpp +++ b/TabloMaster/src/utils/networking.cpp @@ -1,197 +1,24 @@ -#include "node_session_controller.h" -#include "udp_discovery.h" +// #include "udp_discovery.h" -#include "tabnet.h" #include "networking.h" -#include "methods.h" -#include "client_session_controller.h" -#include #include #include -#include -#include #include #include -#include #include -#include -#include -#include -#include -#include -#include Networking::Networking(std::string interface) { std::wcout << "Start socket..." << std::endl; - udpDiscoveryThread = std::thread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); + // udpDiscoveryThread = std::thread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); - // Client socket - int serverSocket = socket(AF_INET, SOCK_STREAM, 0); - sockaddr_in serverAddress; - serverAddress.sin_family = AF_INET; - serverAddress.sin_port = htons(4003); - serverAddress.sin_addr.s_addr = inet_addr(tabnet::getLocalIpAddress(interface).c_str()); - - bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)); - listen(serverSocket, 5); - - while (true) { - int clientSocket = accept(serverSocket, nullptr, nullptr); - std::wcout << "New client connection!" << std::endl; - clientConnections.push_back(std::thread( - &Networking::handleClientConnection, - this, - serverSocket, clientSocket - )); - } + // TODO: Implement accept client here } void Networking::handleClientConnection(int serverSocket, int clientSocket) { - ClientSessionManager clientSessionManager(clientSocket); + // TODO: add packet distribution logic here - std::thread clientThread( - &ClientSessionManager::sessionControllerCycle, - &clientSessionManager - ); - // TCP - std::vector nodeIps; - int responseCode = 0; - while (clientSessionManager.isConnected()) { - std::vector newNodeIps = udpDiscovery.getNodeAdresses(); - nodeIps = getIps(); - - // sort vectors to compare them - std::sort(newNodeIps.begin(), newNodeIps.end()); - std::sort(nodeIps.begin(), nodeIps.end()); - - if(newNodeIps.size() == 0) { - std::wcout << "No connected nodes!" << std::endl; - if (nodeIps.size() > 0) { - // Close connections with nodes that dont exist anymore - for (int index = 0; index < nodeIps.size(); index++) { - std::wcout << "Close connection: " << nodeIps[index].c_str() << std::endl; - close(getConnectionAtIp(nodeIps[index])->socket); - removeConnectionAtIp(nodeIps[index]); - } - } - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - } else if(newNodeIps == nodeIps) { - bool nodeShutdown = false; - while (!nodeShutdown) { - // TODO: Replace with real distribution later - std::vector orders; - while(clientSessionManager.hasOrder()) { - orders.push_back(clientSessionManager.popOrder()); - } - - for (int i = 0; i < connections.size(); i++) { - Connection* currentConnection = &connections[i]; - - for (int j = 0; j < orders.size(); j++) { - currentConnection->controller->pushOrder(orders[j]); - } - - while (currentConnection->controller->hasSolution()) { - clientSessionManager.pushSolution( - currentConnection->controller->popSolution() - ); - } - } - } - } else if (newNodeIps != nodeIps) { - std::wcout << "New nodes!" << std::endl; - - // Create connections with nodes - for (int index = 0; index < newNodeIps.size(); index++) { - // If newNodeIps[index] not in nodeIps (keys of connections) - if(std::find(nodeIps.begin(), nodeIps.end(), newNodeIps[index]) == nodeIps.end()) { - // Create new connection - int newSocket = socket(AF_INET, SOCK_STREAM, 0); - - sockaddr_in nodeAddress; - nodeAddress.sin_family = AF_INET; - nodeAddress.sin_port = htons(4004); - nodeAddress.sin_addr.s_addr = inet_addr(newNodeIps[index].c_str()); - - if(connect(newSocket, (struct sockaddr*) &nodeAddress, sizeof(nodeAddress)) == -1) { - udpDiscovery.removeNodeAddress(newNodeIps[index]); - continue; - } - - tabnet::Packet responseCode = tabnet::receiveMessage(newSocket); - - // handshake compleate - if(responseCode.method == METHODS::success) { - auto nodeSessionController = std::make_unique(); - - std::thread nodeSessionCycleThread( - &NodeSessionController::sessionControllerCycle, - nodeSessionController.get(), - newSocket - ); - - connections.emplace_back(Connection{ - newNodeIps[index], - newSocket, - std::move(nodeSessionCycleThread), - std::move(nodeSessionController) - }); - - std::wcout << "Connection established: " << responseCode.method << " at ip: " << newNodeIps[index].c_str() << " | Connections.size(): " << connections.size() << std::endl; - } - } - } - - // Close connections with nodes that dont exist anymore - for (int index = 0; index < nodeIps.size(); index++) { - std::wcout << "Iterating over nodeIPS" << std::endl; - if(std::find(newNodeIps.begin(), newNodeIps.end(), nodeIps[index]) == newNodeIps.end()) { - // NOTE: This is NOT tested! (yet) - std::wcout << "Close connection: " << nodeIps[index].c_str() << std::endl; - close(getConnectionAtIp(nodeIps[index])->socket); - removeConnectionAtIp(nodeIps[index]); - nodeIps.erase(nodeIps.begin() + index); - } - } - } else { - std::wcout << "unknown operation!" << std::endl; - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - } - } - - // Close node con - for(int index = 0; index < connections.size(); index++) { - close(getConnectionAtIp(nodeIps[index])->socket); - } - std::wcout << "Terminate handleClientConnection for " << clientSocket << std::endl; - udpDiscoveryThread.join(); -} - -std::vector Networking::getIps() { - std::vector keys; - for (const Connection& con : connections) { - keys.push_back(con.ip); - } - return keys; -} - -void Networking::removeConnectionAtIp(std::string ip) { - for (int index = 0; index < connections.size(); index++) { - if (connections[index].ip == ip) { - connections.erase(connections.begin() + index); - return; - } - } -} - -Networking::Connection* Networking::getConnectionAtIp(std::string ip) { - for (int index = 0; index < connections.size(); index++) { - if (connections[index].ip == ip) { - return &connections[index]; - } - } - return nullptr; + // udpDiscoveryThread.join(); } diff --git a/TabloMaster/src/utils/networking.h b/TabloMaster/src/utils/networking.h index 21ef557..df51387 100644 --- a/TabloMaster/src/utils/networking.h +++ b/TabloMaster/src/utils/networking.h @@ -1,13 +1,10 @@ #ifndef NETWORKING_H #define NETWORKING_H -#include -#include -#include +#include #include -#include "udp_discovery.h" -#include "node_session_controller.h" +// #include "udp_discovery.h" class Networking { @@ -16,23 +13,8 @@ class Networking void handleClientConnection(int serverSocket, int clientSocket); private: - struct Connection { - std::string ip; - int socket; - std::thread thread; - std::unique_ptr controller; - - Connection(std::string ip_, int sock_, std::thread t, std::unique_ptr ctrl): ip(std::move(ip_)), socket(sock_), thread(std::move(t)), controller(std::move(ctrl)) {} - }; - - std::vector connections; - std::vector clientConnections; - UdpDiscovery udpDiscovery; - std::thread udpDiscoveryThread; - - std::vector getIps(); - void removeConnectionAtIp(std::string ip); - Connection* getConnectionAtIp(std::string ip); + // UdpDiscovery udpDiscovery; + // std::thread udpDiscoveryThread; }; #endif diff --git a/TabloMaster/src/utils/node_session_controller.cpp b/TabloMaster/src/utils/node_session_controller.cpp deleted file mode 100644 index d7748a0..0000000 --- a/TabloMaster/src/utils/node_session_controller.cpp +++ /dev/null @@ -1,114 +0,0 @@ -#include "node_session_controller.h" - -#include "tabnet.h" -#include "methods.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -NodeSessionController::NodeSessionController() {} - -void NodeSessionController::sessionControllerCycle(int socket) { - this->socket = socket; - - int responseCode = 0; - while (responseCode >= 0) { - // Receive solutions - tabnet::Packet solutionCount = tabnet::receiveMessage(socket); - if (solutionCount.method == METHODS::size) { - responseCode = tabnet::sendMessage(socket, METHODS::success, ""); - for (int index = 0; index < std::stoi(solutionCount.payload); index++) { - tabnet::Packet packet = tabnet::receiveMessage(socket); - pushSolution(packet); - responseCode = tabnet::sendMessage(socket, METHODS::success, ""); - } - } else { - responseCode = tabnet::sendMessage(socket, METHODS::failed, ""); - std::wcout << "Something went wrong during receiving size!" << std::endl; - std::wcout << "Got: " << solutionCount.method << " instead of " << METHODS::size << " (size)" << std::endl; - } - - tabnet::Packet ready = tabnet::receiveMessage(socket); - - // Send orders - int orderCollectionSize = getOrderCollectionSize(); - responseCode = tabnet::sendMessage(socket, METHODS::size, std::to_string(orderCollectionSize)); - if (orderCollectionSize > 0) { - if (tabnet::receiveMessage(socket).method == METHODS::success) { - for(int index = 0; index < orderCollectionSize; index++) { - responseCode = tabnet::sendPacket(socket, popOrder()); - tabnet::Packet response = tabnet::receiveMessage(socket); - if (response.method != METHODS::success) { - std::wcout << "Send order to node failed: got " << response.method << std::endl; - } - } - } else { - std::wcout << "Send of size failed!" << std::endl; - } - } - - if (responseCode < 0) { - // TODO: FIX THIS - responseCode = 0; - //udpDiscovery.removeNodeAddress(nodeIps[index]); - connected = false; - break; - } - } - connected = false; -} - -bool NodeSessionController::hasSolution() { - std::lock_guard lock(mtx); - return !solutionCollection.empty(); -} - -bool NodeSessionController::hasOrder() { - std::lock_guard lock(mtx); - return !orderCollection.empty(); -} - -bool NodeSessionController::isConnected() { - std::lock_guard lock(mtx); - return connected; -} - -tabnet::Packet NodeSessionController::popOrder() { - return popCollection(orderCollection); -} - -tabnet::Packet NodeSessionController::popSolution() { - return popCollection(solutionCollection); -} - -tabnet::Packet NodeSessionController::popCollection(std::vector collection) { - std::lock_guard lock(mtx); - if (!collection.empty()) { - tabnet::Packet firstOrder = collection[0]; - collection.erase(collection.begin()); - return firstOrder; - } - tabnet::Packet emptyPacket; - return emptyPacket; -} - -void NodeSessionController::pushSolution(tabnet::Packet solution) { - std::lock_guard lock(mtx); - solutionCollection.push_back(solution); -} - -void NodeSessionController::pushOrder(tabnet::Packet order) { - std::lock_guard lock(mtx); - orderCollection.push_back(order); -} - -int NodeSessionController::getOrderCollectionSize() { - std::lock_guard lock(mtx); - return orderCollection.size(); -} diff --git a/TabloMaster/src/utils/node_session_controller.h b/TabloMaster/src/utils/node_session_controller.h deleted file mode 100644 index c2251cc..0000000 --- a/TabloMaster/src/utils/node_session_controller.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef NODE_SESSION_CONTROLLER_H -#define NODE_SESSION_CONTROLLER_H - -#include -#include -#include -#include "tabnet.h" - -class NodeSessionController -{ - public: - NodeSessionController(); - void sessionControllerCycle(int socket); - bool isConnected(); - bool hasOrder(); - bool hasSolution(); - tabnet::Packet popOrder(); - tabnet::Packet popSolution(); - int getOrderCollectionSize(); - void pushSolution(tabnet::Packet); - void pushOrder(tabnet::Packet order); - - private: - int socket; - std::vector orderCollection; - std::vector solutionCollection; - bool connected = true; - std::mutex mtx; - tabnet::Packet popCollection(std::vector collection); -}; - -#endif diff --git a/TabloMaster/src/utils/udp_discovery.cpp b/TabloMaster/src/utils/udp_discovery.cpp index 4d85f22..e550cdd 100644 --- a/TabloMaster/src/utils/udp_discovery.cpp +++ b/TabloMaster/src/utils/udp_discovery.cpp @@ -1,8 +1,5 @@ #include "udp_discovery.h" -#include "tabnet.h" -#include "methods.h" - #include #include #include @@ -20,6 +17,7 @@ #include void UdpDiscovery::udpDiscoveryCycle(std::string interface) { + /* std::wcout << "Start Udp discovery..." << std::endl; std::string containerIP = tabnet::getLocalIpAddress(interface); @@ -139,6 +137,7 @@ void UdpDiscovery::udpDiscoveryCycle(std::string interface) { } close(serverSocket); std::wcout << "UDP socket closed..." << std::endl; + */ } std::vector UdpDiscovery::getNodeAdresses() { diff --git a/lib/libtabnet/CMakeLists.txt b/lib/libtabnet/CMakeLists.txt index 4749e00..a5573f2 100644 --- a/lib/libtabnet/CMakeLists.txt +++ b/lib/libtabnet/CMakeLists.txt @@ -4,12 +4,14 @@ project(tabnet) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) +include_directories(include) + file(GLOB_RECURSE SOURCES "src/*.cpp") # file(GLOB_RECURSE HEADERS "include/*.h") -# -target_include_directories(tabnet PUBLIC - ${CMAKE_CURRENT_SOURCE_DIR}/include -) + +add_library(tabnet SHARED ${SOURCES}) + +target_include_directories(tabnet PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) install(TARGETS tabnet DESTINATION lib) install(DIRECTORY include/ DESTINATION include) From 728e78fd51b78f159d5e28651885c5b6d21af2e4 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 16:11:14 +0200 Subject: [PATCH 13/64] update: update ttp2 --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 12f705a..3ba7dd7 100644 --- a/flake.lock +++ b/flake.lock @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1778782072, - "narHash": "sha256-PTnhNzLTtT/BKjUlFbkZ/Vo1F/6e5SqbkFMATD/CzBQ=", + "lastModified": 1778851200, + "narHash": "sha256-A68XZHDT/GOVfI7mSpyi9brMAlmOrJ1BooeXT2nywUc=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "d1a3b10474adb065395b7f508ec953e774d76a13", + "rev": "2e04564b5998b47f187efcd814771b47a7054166", "type": "github" }, "original": { From 7da90b3d9a0781bdec74bbd20ee801bf3ada7c1e Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 18:47:52 +0200 Subject: [PATCH 14/64] update: implement ttp2 in client networking WIP --- TabloClient/src/utils/networking.cpp | 48 ++++++++++++++++++++-------- TabloClient/src/utils/networking.h | 15 ++++----- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/TabloClient/src/utils/networking.cpp b/TabloClient/src/utils/networking.cpp index 3400799..cef790a 100644 --- a/TabloClient/src/utils/networking.cpp +++ b/TabloClient/src/utils/networking.cpp @@ -1,28 +1,48 @@ #include "networking.h" +#include #include +#include +#include +#include +#include +#include +#include Networking::Networking() {} void Networking::networkingCycle(std::string tabloMaster) { -} + int serverSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + + sockaddr_in serverAddress; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(4003); + serverAddress.sin_addr.s_addr = inet_addr(tabloMaster.c_str()); -bool Networking::hasSolution() { - std::lock_guard lock(mtx); - return !solutionCollection.empty(); + int connectionResult = connect(serverSocket, (struct sockaddr*) &serverAddress, sizeof(serverAddress)); + + if (connectionResult < 0 && errno != EINPROGRESS) { + std::wcout << "Connection failed!" << std::endl; + return; + } + + clientSessionController = std::make_shared(serverSocket); + + auto controller = clientSessionController; + std::thread networkThread([controller]() { + controller->networkingSession(); + }); } -std::string Networking::popSolution() { - std::lock_guard lock(mtx); - std::string solution = solutionCollection[0]; - solutionCollection.erase(solutionCollection.begin()); - return solution; +bool Networking::hasResponse() { + auto controller = clientSessionController; + return controller.hasResponse(); } -void Networking::pushOrder(int method, std::string content) { - std::lock_guard lock(mtx); - std::map order; - order[method] = content; - orderCollection.push_back(order); +ClientSessionController::Packet Networking::popResponse() { + } +void Networking::pushRequest(ClientSessionController::Packet packet) { + +} diff --git a/TabloClient/src/utils/networking.h b/TabloClient/src/utils/networking.h index b2f3c3f..fd7b980 100644 --- a/TabloClient/src/utils/networking.h +++ b/TabloClient/src/utils/networking.h @@ -1,10 +1,12 @@ #ifndef NETWORKING_H #define NETWORKING_H +#include #include #include #include #include +#include class Networking { @@ -12,17 +14,12 @@ class Networking Networking(); void networkingCycle(std::string tabloMaster); - bool hasSolution(); - std::string popSolution(); - void pushOrder(int method, std::string content); + bool hasResponse(); + ClientSessionController::Packet popResponse(); + void pushRequest(ClientSessionController::Packet packet); private: - std::vector> orderCollection; - std::vector solutionCollection; - std::mutex mtx; - - std::string recieveMessage(int socket); - bool isNumeric(const std::string& string); + std::shared_ptr clientSessionController; }; #endif From 8b23e2239dcc375390687db6a748e49e0a26d07a Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 19:01:51 +0200 Subject: [PATCH 15/64] update: fix naming issue --- TabloClient/src/utils/cli.cpp | 16 +++++++++------- .../{networking.cpp => network_manager.cpp} | 14 +++++++------- .../utils/{networking.h => network_manager.h} | 8 ++++---- 3 files changed, 20 insertions(+), 18 deletions(-) rename TabloClient/src/utils/{networking.cpp => network_manager.cpp} (74%) rename TabloClient/src/utils/{networking.h => network_manager.h} (81%) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index d5c493e..9310bee 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -1,18 +1,19 @@ #include "cli.h" +#include #include #include #include -#include "networking.h" +#include "network_manager.h" Cli::Cli(std::string tabloMaster) { std::wcout << "Client! Tablo master at: " << tabloMaster.c_str() << std::endl; - Networking networking; + NetworkManager networkManager; std::thread networkingThread( - &Networking::networkingCycle, - &networking, + &NetworkManager::networkingCycle, + &networkManager, tabloMaster ); @@ -22,12 +23,13 @@ Cli::Cli(std::string tabloMaster) { std::cin >> content; std::wcout << std::endl; - networking.pushOrder(1, content); + // networkManager.pushRequest(); std::wcout << "Waiting for solution..." << std::endl; - while (!networking.hasSolution()) {} // Wait for solution + while (!networkManager.hasResponse()) {} // Wait for solution - std::wcout << networking.popSolution().c_str() << std::endl; + //TODO: pop response and display + } } diff --git a/TabloClient/src/utils/networking.cpp b/TabloClient/src/utils/network_manager.cpp similarity index 74% rename from TabloClient/src/utils/networking.cpp rename to TabloClient/src/utils/network_manager.cpp index cef790a..cadec84 100644 --- a/TabloClient/src/utils/networking.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -1,4 +1,4 @@ -#include "networking.h" +#include "network_manager.h" #include #include @@ -9,9 +9,9 @@ #include #include -Networking::Networking() {} +NetworkManager::NetworkManager() {} -void Networking::networkingCycle(std::string tabloMaster) { +void NetworkManager::networkingCycle(std::string tabloMaster) { int serverSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); sockaddr_in serverAddress; @@ -34,15 +34,15 @@ void Networking::networkingCycle(std::string tabloMaster) { }); } -bool Networking::hasResponse() { +bool NetworkManager::hasResponse() { auto controller = clientSessionController; - return controller.hasResponse(); + return controller->hasResponse(); } -ClientSessionController::Packet Networking::popResponse() { +ClientSessionController::Packet NetworkManager::popResponse() { } -void Networking::pushRequest(ClientSessionController::Packet packet) { +void NetworkManager::pushRequest(ClientSessionController::Packet packet) { } diff --git a/TabloClient/src/utils/networking.h b/TabloClient/src/utils/network_manager.h similarity index 81% rename from TabloClient/src/utils/networking.h rename to TabloClient/src/utils/network_manager.h index fd7b980..98ff19f 100644 --- a/TabloClient/src/utils/networking.h +++ b/TabloClient/src/utils/network_manager.h @@ -1,5 +1,5 @@ -#ifndef NETWORKING_H -#define NETWORKING_H +#ifndef NETWORK_MANAGER_H +#define NETWORK_MANAGER_H #include #include @@ -8,10 +8,10 @@ #include #include -class Networking +class NetworkManager { public: - Networking(); + NetworkManager(); void networkingCycle(std::string tabloMaster); bool hasResponse(); From 5e610d4a5c6a362fd6dbcd6aa11d7a1bf3da89c3 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 19:05:52 +0200 Subject: [PATCH 16/64] update: diable TabloNode until it is fixed --- TabloNode/src/tabloNode.cpp | 8 ++++---- TabloNode/src/utils/networking.cpp | 3 ++- TabloNode/src/utils/udp_discovery.cpp | 3 ++- TabloNode/src/utils/worker.cpp | 5 ++--- TabloNode/src/utils/worker.h | 4 ++-- 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/TabloNode/src/tabloNode.cpp b/TabloNode/src/tabloNode.cpp index 4052c80..70ca456 100644 --- a/TabloNode/src/tabloNode.cpp +++ b/TabloNode/src/tabloNode.cpp @@ -1,7 +1,7 @@ -#include +#include #include -#include "utils/networking.h" +//#include "utils/networking.h" int main(int argc, char *argv[]) { @@ -12,12 +12,12 @@ int main(int argc, char *argv[]) if (argc > 0) { for(int index = 0; index < argc; index++) { if (std::string(argv[index]).rfind("--interface", 0) == 0) { - Networking networking(argv[index+1]); + //Networking networking(argv[index+1]); } } } else { // Use config file to set Interface (TODO) - Networking networking("eth0"); + //Networking networking("eth0"); } return 0; diff --git a/TabloNode/src/utils/networking.cpp b/TabloNode/src/utils/networking.cpp index 547a0aa..bd0d29c 100644 --- a/TabloNode/src/utils/networking.cpp +++ b/TabloNode/src/utils/networking.cpp @@ -2,7 +2,6 @@ #include "tabnet.h" -#include "methods.h" #include "udp_discovery.h" #include "worker.h" @@ -16,6 +15,7 @@ #include #include +/* Networking::Networking(std::string interface) { std::wcout << "Start Socket...." << std::endl; @@ -115,3 +115,4 @@ void Networking::handleClientConnection(int serverSocket, int clientSocket) { } } } +*/ diff --git a/TabloNode/src/utils/udp_discovery.cpp b/TabloNode/src/utils/udp_discovery.cpp index 5562e68..09be39d 100644 --- a/TabloNode/src/utils/udp_discovery.cpp +++ b/TabloNode/src/utils/udp_discovery.cpp @@ -1,7 +1,6 @@ #include "udp_discovery.h" #include "tabnet.h" -#include "methods.h" #include #include @@ -13,6 +12,7 @@ #include #include +/* UdpDiscovery::UdpDiscovery(std::string interface) { std::wcout << "Start udp discovery..." << std::endl; @@ -80,3 +80,4 @@ UdpDiscovery::UdpDiscovery(std::string interface) { close(udpSocket); } +*/ diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index ae54cda..955b7e0 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -1,14 +1,12 @@ - #include "worker.h" #include #include #include -#include "tabnet.h" -#include "methods.h" // Cycle +/* void Worker::solveOrderCycle() { while (true) { int orderSize = getOrderCollectionSize(); @@ -92,3 +90,4 @@ int Worker::getOrderCollectionSize() { std::lock_guard lock(mtx); return orders.size(); } +*/ diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index 06e5cca..f722e20 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -5,7 +5,7 @@ #include #include "tabnet.h" - +/* class Worker { public: @@ -31,5 +31,5 @@ class Worker std::vector solutions; std::vector orders; }; - +*/ #endif From 729c5253c30d8a95ad9a45fd1b1aaba04f2379ff Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 19:13:11 +0200 Subject: [PATCH 17/64] update: add simple logic to client cli --- TabloClient/src/utils/cli.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 9310bee..8c5f585 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -23,13 +23,22 @@ Cli::Cli(std::string tabloMaster) { std::cin >> content; std::wcout << std::endl; - // networkManager.pushRequest(); + ClientSessionController::Packet packet; + packet.id = 1; //TODO: autoincrement in TTP2 + + ClientSessionController::Standard payload; + payload.payload = content; + packet.payload = payload; + + networkManager.pushRequest(packet); std::wcout << "Waiting for solution..." << std::endl; while (!networkManager.hasResponse()) {} // Wait for solution - //TODO: pop response and display - + ClientSessionController::Packet response = networkManager.popResponse(); + ClientSessionController::Standard responsePayload = std::get(response.payload); + + std::wcout << "response: " << responsePayload.payload.c_str() << std::endl; } } From ab9642e3e09a9d5f8a9ef96e9b2dc9ecafdbdbec Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 19:16:11 +0200 Subject: [PATCH 18/64] update: finish implementation of network manager in client --- TabloClient/src/utils/network_manager.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/TabloClient/src/utils/network_manager.cpp b/TabloClient/src/utils/network_manager.cpp index cadec84..0179370 100644 --- a/TabloClient/src/utils/network_manager.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -20,7 +20,8 @@ void NetworkManager::networkingCycle(std::string tabloMaster) { serverAddress.sin_addr.s_addr = inet_addr(tabloMaster.c_str()); int connectionResult = connect(serverSocket, (struct sockaddr*) &serverAddress, sizeof(serverAddress)); - + + // Wait for server to accept if (connectionResult < 0 && errno != EINPROGRESS) { std::wcout << "Connection failed!" << std::endl; return; @@ -40,9 +41,11 @@ bool NetworkManager::hasResponse() { } ClientSessionController::Packet NetworkManager::popResponse() { - + auto controller = clientSessionController; + return controller->popResponse(); } void NetworkManager::pushRequest(ClientSessionController::Packet packet) { - + auto controller = clientSessionController; + controller->pushRequest(packet); } From 73c66d5467f2d971c1617b2b74ff1352fc75f5aa Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 19:56:25 +0200 Subject: [PATCH 19/64] update: implement accept client in master --- TabloMaster/src/tabloMaster.cpp | 6 +- TabloMaster/src/utils/network_manager.cpp | 73 +++++++++++++++++++ .../utils/{networking.h => network_manager.h} | 8 +- TabloMaster/src/utils/networking.cpp | 24 ------ 4 files changed, 80 insertions(+), 31 deletions(-) create mode 100644 TabloMaster/src/utils/network_manager.cpp rename TabloMaster/src/utils/{networking.h => network_manager.h} (68%) delete mode 100644 TabloMaster/src/utils/networking.cpp diff --git a/TabloMaster/src/tabloMaster.cpp b/TabloMaster/src/tabloMaster.cpp index 049e293..06c5ec3 100644 --- a/TabloMaster/src/tabloMaster.cpp +++ b/TabloMaster/src/tabloMaster.cpp @@ -1,7 +1,7 @@ #include #include -#include "utils/networking.h" +#include "utils/network_manager.h" int main(int argc, char *argv[]) { @@ -9,12 +9,12 @@ int main(int argc, char *argv[]) if (argc > 0) { for(int index = 0; index < argc; index++) { if (std::string(argv[index]).rfind("--interface", 0) == 0) { - Networking networking(argv[index+1]); + NetworkManager networkManager(argv[index+1]); } } } else { // Use config file to set Interface (TODO) - Networking networking("eth0"); + NetworkManager networkManager("eth0"); } return 0; diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp new file mode 100644 index 0000000..dc94e80 --- /dev/null +++ b/TabloMaster/src/utils/network_manager.cpp @@ -0,0 +1,73 @@ +// #include "udp_discovery.h" + +#include "network_manager.h" + +#include + +#include +#include +#include +#include +#include +#include + +NetworkManager::NetworkManager(std::string interface) { + std::wcout << "Start socket..." << std::endl; + // udpDiscoveryThread = std::thread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); + + ServerSessionController tempServerSessionController; + std::string containerIP = tempServerSessionController.getLocalIpAddress(interface); + + sockaddr_in serverAddress; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(4003); + serverAddress.sin_addr.s_addr = inet_addr(containerIP.c_str()); + + int serverSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + if(bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) { + std::wcout << "Bind failed!" << std::endl; + return; + } + + // Create epoll + int epollFd = epoll_create1(0); + if (epollFd == -1) { + std::wcout << "Failed to create epoll!" << std::endl; + } + // Set epoll action for server + struct epoll_event serverEvents; + serverEvents.events = EPOLLIN | EPOLLOUT; + serverEvents.data.fd = serverSocket; + if (epoll_ctl(epollFd, EPOLL_CTL_ADD, serverSocket, &serverEvents) == -1) { + std::wcout << "Failed to set epoll_ctl!" << std::endl; + return; + } + + listen(serverSocket, 5); + std::vector clientConnections; + while (true) { + const int MAX_EVENTS = 10; + struct epoll_event events[MAX_EVENTS]; + int epollRequestCount = epoll_wait(epollFd, events, MAX_EVENTS, -1); + + for (int index = 0; index < epollRequestCount; ++index) { + if (events[index].data.fd == serverSocket) { + int clientSocket = accept4(serverSocket, nullptr, nullptr, SOCK_NONBLOCK); + std::wcout << "New clientSocket: " << clientSocket << std::endl; + + clientConnections.push_back(std::thread([this, serverSocket, clientSocket]() { + this->handleClientConnection(serverSocket, clientSocket); + })); + } + } + } + // TODO: Implement accept client here +} + +void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { + std::wcout << "HELLO FROM HANDLE CLIENT CONN!" << std::endl; + // TODO: add packet distribution logic here + + + // udpDiscoveryThread.join(); +} diff --git a/TabloMaster/src/utils/networking.h b/TabloMaster/src/utils/network_manager.h similarity index 68% rename from TabloMaster/src/utils/networking.h rename to TabloMaster/src/utils/network_manager.h index df51387..29dc302 100644 --- a/TabloMaster/src/utils/networking.h +++ b/TabloMaster/src/utils/network_manager.h @@ -1,15 +1,15 @@ -#ifndef NETWORKING_H -#define NETWORKING_H +#ifndef NETWORK_MANAGER_H +#define NETWORK_MANAGER_H #include #include // #include "udp_discovery.h" -class Networking +class NetworkManager { public: - Networking(std::string interface); + NetworkManager(std::string interface); void handleClientConnection(int serverSocket, int clientSocket); private: diff --git a/TabloMaster/src/utils/networking.cpp b/TabloMaster/src/utils/networking.cpp deleted file mode 100644 index 9095668..0000000 --- a/TabloMaster/src/utils/networking.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// #include "udp_discovery.h" - -#include "networking.h" - -#include -#include -#include -#include -#include - -Networking::Networking(std::string interface) { - std::wcout << "Start socket..." << std::endl; - // udpDiscoveryThread = std::thread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); - - - // TODO: Implement accept client here -} - -void Networking::handleClientConnection(int serverSocket, int clientSocket) { - // TODO: add packet distribution logic here - - - // udpDiscoveryThread.join(); -} From dd3e1cbd95c2b9331defaf7e9ed50da3f82b29d2 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 19:59:07 +0200 Subject: [PATCH 20/64] update: fix client crash --- TabloClient/src/utils/network_manager.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/TabloClient/src/utils/network_manager.cpp b/TabloClient/src/utils/network_manager.cpp index 0179370..4111ce5 100644 --- a/TabloClient/src/utils/network_manager.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -28,11 +28,6 @@ void NetworkManager::networkingCycle(std::string tabloMaster) { } clientSessionController = std::make_shared(serverSocket); - - auto controller = clientSessionController; - std::thread networkThread([controller]() { - controller->networkingSession(); - }); } bool NetworkManager::hasResponse() { From 990663c196e8aabfedb277d57157e4ea4b451f07 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 21:13:17 +0200 Subject: [PATCH 21/64] update: implement simple client response cycle --- TabloMaster/src/utils/network_manager.cpp | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index dc94e80..e7d25fe 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -10,6 +10,7 @@ #include #include #include +#include NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start socket..." << std::endl; @@ -65,9 +66,25 @@ NetworkManager::NetworkManager(std::string interface) { } void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { - std::wcout << "HELLO FROM HANDLE CLIENT CONN!" << std::endl; + std::wcout << "Handle client conn" << std::endl; // TODO: add packet distribution logic here + auto serverSessionController = std::make_shared(serverSocket, clientSocket); + + std::thread networkingSession([serverSessionController]() { + serverSessionController->networkingSession(); + }); + + while (serverSessionController->isConnected()) { + if (serverSessionController->hasRequest()) { + ServerSessionController::Packet packet = serverSessionController->popRequest(); + std::wcout << "Received packet id: " << packet.id << std::endl; + serverSessionController->pushResponse(packet); + } + } + + std::wcout << "Terminated!" << std::endl; + networkingSession.detach(); // udpDiscoveryThread.join(); } From f3f7731d1e79098c8dee4f2a2dee859eea56a103 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 15 May 2026 21:38:46 +0200 Subject: [PATCH 22/64] update: remove falsely created thread in client --- TabloClient/src/utils/cli.cpp | 8 +++----- TabloClient/src/utils/network_manager.cpp | 5 +++-- TabloClient/src/utils/network_manager.h | 3 ++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 8c5f585..5ce59df 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -11,11 +11,9 @@ Cli::Cli(std::string tabloMaster) { std::wcout << "Client! Tablo master at: " << tabloMaster.c_str() << std::endl; NetworkManager networkManager; - std::thread networkingThread( - &NetworkManager::networkingCycle, - &networkManager, - tabloMaster - ); + if (networkManager.createSocket(tabloMaster) < 0) { + return; + } while (true) { std::string content; diff --git a/TabloClient/src/utils/network_manager.cpp b/TabloClient/src/utils/network_manager.cpp index 4111ce5..0e8ea14 100644 --- a/TabloClient/src/utils/network_manager.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -11,7 +11,7 @@ NetworkManager::NetworkManager() {} -void NetworkManager::networkingCycle(std::string tabloMaster) { +int NetworkManager::createSocket(std::string tabloMaster) { int serverSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); sockaddr_in serverAddress; @@ -24,10 +24,11 @@ void NetworkManager::networkingCycle(std::string tabloMaster) { // Wait for server to accept if (connectionResult < 0 && errno != EINPROGRESS) { std::wcout << "Connection failed!" << std::endl; - return; + return -1; } clientSessionController = std::make_shared(serverSocket); + return 0; } bool NetworkManager::hasResponse() { diff --git a/TabloClient/src/utils/network_manager.h b/TabloClient/src/utils/network_manager.h index 98ff19f..1c966c9 100644 --- a/TabloClient/src/utils/network_manager.h +++ b/TabloClient/src/utils/network_manager.h @@ -12,7 +12,8 @@ class NetworkManager { public: NetworkManager(); - void networkingCycle(std::string tabloMaster); + + int createSocket(std::string tabloMaster); bool hasResponse(); ClientSessionController::Packet popResponse(); From 8f944477b5da8d5f1178642ba9fa890bab17ce2a Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sat, 16 May 2026 13:48:58 +0200 Subject: [PATCH 23/64] update: fix client network_manager --- TabloClient/src/utils/cli.cpp | 6 +++--- TabloClient/src/utils/network_manager.cpp | 19 +++++++++++-------- TabloClient/src/utils/network_manager.h | 3 +-- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 5ce59df..d0bcdcc 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -12,6 +12,7 @@ Cli::Cli(std::string tabloMaster) { NetworkManager networkManager; if (networkManager.createSocket(tabloMaster) < 0) { + std::wcout << "Create network manager failed!" << std::endl; return; } @@ -19,12 +20,11 @@ Cli::Cli(std::string tabloMaster) { std::string content; std::wcout << "Content: "; std::cin >> content; - std::wcout << std::endl; - ClientSessionController::Packet packet; + Networking::Packet packet; packet.id = 1; //TODO: autoincrement in TTP2 - ClientSessionController::Standard payload; + Networking::Standard payload; payload.payload = content; packet.payload = payload; diff --git a/TabloClient/src/utils/network_manager.cpp b/TabloClient/src/utils/network_manager.cpp index 0e8ea14..007c293 100644 --- a/TabloClient/src/utils/network_manager.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -26,22 +26,25 @@ int NetworkManager::createSocket(std::string tabloMaster) { std::wcout << "Connection failed!" << std::endl; return -1; } - + clientSessionController = std::make_shared(serverSocket); + + std::thread networkThread([this]() { + clientSessionController->networkingSession(); + }); + networkThread.detach(); + return 0; } bool NetworkManager::hasResponse() { - auto controller = clientSessionController; - return controller->hasResponse(); + return clientSessionController->hasResponse(); } ClientSessionController::Packet NetworkManager::popResponse() { - auto controller = clientSessionController; - return controller->popResponse(); + return clientSessionController->popResponse(); } -void NetworkManager::pushRequest(ClientSessionController::Packet packet) { - auto controller = clientSessionController; - controller->pushRequest(packet); +void NetworkManager::pushRequest(Networking::Packet packet) { + clientSessionController->pushRequest(packet); } diff --git a/TabloClient/src/utils/network_manager.h b/TabloClient/src/utils/network_manager.h index 1c966c9..b0c02e4 100644 --- a/TabloClient/src/utils/network_manager.h +++ b/TabloClient/src/utils/network_manager.h @@ -3,8 +3,7 @@ #include #include -#include -#include +#include #include #include From 199536d2a6a343217f2d2237daf9e13ba20f8eec Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sat, 16 May 2026 14:09:30 +0200 Subject: [PATCH 24/64] update: use autoID from TTP2 --- TabloClient/src/utils/cli.cpp | 3 +-- flake.lock | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index d0bcdcc..862e68c 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -22,7 +22,6 @@ Cli::Cli(std::string tabloMaster) { std::cin >> content; Networking::Packet packet; - packet.id = 1; //TODO: autoincrement in TTP2 Networking::Standard payload; payload.payload = content; @@ -36,7 +35,7 @@ Cli::Cli(std::string tabloMaster) { ClientSessionController::Packet response = networkManager.popResponse(); ClientSessionController::Standard responsePayload = std::get(response.payload); - std::wcout << "response: " << responsePayload.payload.c_str() << std::endl; + std::wcout << "Response:\nID: " << response.id << "\nPayload: " << responsePayload.payload.c_str() << std::endl; } } diff --git a/flake.lock b/flake.lock index 3ba7dd7..f381f3f 100644 --- a/flake.lock +++ b/flake.lock @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1778851200, - "narHash": "sha256-A68XZHDT/GOVfI7mSpyi9brMAlmOrJ1BooeXT2nywUc=", + "lastModified": 1778932947, + "narHash": "sha256-XP1M5EFjP4KpGlSpSMJp8k/7Ulhm6+Pb9xOByZxPEdk=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "2e04564b5998b47f187efcd814771b47a7054166", + "rev": "e88cc71a6b36d5f99958f28828e2202ec0b887e0", "type": "github" }, "original": { From b14bbe28bd7f259f23968bb77f9cf558a093f4c7 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sat, 16 May 2026 20:51:07 +0200 Subject: [PATCH 25/64] update: refactor udpDiscovery --- TabloMaster/src/utils/udp_discovery.cpp | 52 ++++++++++++++++++----- TabloMaster/src/utils/udp_discovery.h | 5 +++ TabloNode/src/utils/udp_discovery.cpp | 55 ++++++++++++++++++------- TabloNode/src/utils/udp_discovery.h | 4 ++ flake.lock | 6 +-- 5 files changed, 94 insertions(+), 28 deletions(-) diff --git a/TabloMaster/src/utils/udp_discovery.cpp b/TabloMaster/src/utils/udp_discovery.cpp index e550cdd..43940a2 100644 --- a/TabloMaster/src/utils/udp_discovery.cpp +++ b/TabloMaster/src/utils/udp_discovery.cpp @@ -1,5 +1,7 @@ #include "udp_discovery.h" +#include + #include #include #include @@ -17,11 +19,11 @@ #include void UdpDiscovery::udpDiscoveryCycle(std::string interface) { - /* std::wcout << "Start Udp discovery..." << std::endl; - std::string containerIP = tabnet::getLocalIpAddress(interface); - std::string broadcastIP = tabnet::getBroadcastIpAddress(); + ServerSessionController serverSessionController; + std::string containerIP = serverSessionController.getLocalIpAddress(interface); + std::string broadcastIP = serverSessionController.getBroadcastIpAddress(); std::wcout << "Container IP: " << containerIP.c_str() << " | Broadcast IP: " << broadcastIP.c_str() << std::endl; @@ -99,7 +101,7 @@ void UdpDiscovery::udpDiscoveryCycle(std::string interface) { while(true) { // Send message - if (tabnet::sendMessageTo(serverSocket, broadcast, METHODS::ip, containerIP.c_str()) != 0) { + if (sendMessageTo(serverSocket, broadcast, containerIP.c_str()) != 0) { std::wcout << "Broadcast failed!" << std::endl; return; } @@ -121,14 +123,11 @@ void UdpDiscovery::udpDiscoveryCycle(std::string interface) { //std::wcout << "Timeout: no connection" << std::endl; continue; } else { - // tabnet::Packet data; - // ssize_t valread = read(tcpNodeSocket, (char*)&data, sizeof(data)-1); - - tabnet::Packet data = tabnet::receiveMessage(tcpNodeSocket); + std::string data = receiveMessage(tcpNodeSocket); // Add ip to discovered Ip's if not already in vector - if (data.method == METHODS::ip && std::find(nodeIPAddresses.begin(), nodeIPAddresses.end(), std::string(data.payload)) == nodeIPAddresses.end()) { - nodeIPAddresses.push_back(std::string(data.payload)); + if (serverSessionController.isValidIpV4(data) && std::find(nodeIPAddresses.begin(), nodeIPAddresses.end(), data) == nodeIPAddresses.end()) { + nodeIPAddresses.push_back(data); } close(tcpNodeSocket); @@ -137,7 +136,38 @@ void UdpDiscovery::udpDiscoveryCycle(std::string interface) { } close(serverSocket); std::wcout << "UDP socket closed..." << std::endl; - */ +} + +int UdpDiscovery::sendMessageTo(int socket, const sockaddr_in& broadcast, std::string payload) { + if (sendto(socket, payload.data(), payload.size(), 0, (struct sockaddr*)&broadcast, sizeof(broadcast)) < 0) { + std::wcout << "buffer: Sendto Failed!" << std::endl; + return -1; + } + + return 0; +} + +std::string UdpDiscovery::receiveMessage(int socket) { + std::string data; + pollfd pfd{}; + pfd.fd = socket; + pfd.events = POLLIN; + + int ret = poll(&pfd, 1, 10000); + + int bufferSize = 1024; + if (ret > 0 && (pfd.revents & POLLIN)) { + char* buffer = new char[bufferSize]; + ssize_t size = recv(socket, buffer, bufferSize, 0); + + std::wcout << "BUffer: "<< buffer << std::endl; + + data = buffer; + + if (size <= 0) return data; + return data; + } + return data; } std::vector UdpDiscovery::getNodeAdresses() { diff --git a/TabloMaster/src/utils/udp_discovery.h b/TabloMaster/src/utils/udp_discovery.h index 449152c..190d982 100644 --- a/TabloMaster/src/utils/udp_discovery.h +++ b/TabloMaster/src/utils/udp_discovery.h @@ -4,17 +4,22 @@ #include #include #include +#include class UdpDiscovery { public: void udpDiscoveryCycle(std::string interface); + std::vector getNodeAdresses(); void removeNodeAddress(std::string nodeAddress); private: std::vector nodeIPAddresses = {}; std::mutex mtx; + + int sendMessageTo(int socket, const sockaddr_in& broadcast, std::string payload); + std::string receiveMessage(int socket); }; #endif diff --git a/TabloNode/src/utils/udp_discovery.cpp b/TabloNode/src/utils/udp_discovery.cpp index 09be39d..2b00709 100644 --- a/TabloNode/src/utils/udp_discovery.cpp +++ b/TabloNode/src/utils/udp_discovery.cpp @@ -1,6 +1,6 @@ #include "udp_discovery.h" -#include "tabnet.h" +#include #include #include @@ -12,11 +12,11 @@ #include #include -/* UdpDiscovery::UdpDiscovery(std::string interface) { std::wcout << "Start udp discovery..." << std::endl; - - std::string containerIP = tabnet::getLocalIpAddress(interface); + + ServerSessionController serverSessionController; + std::string containerIP = serverSessionController.getLocalIpAddress(interface); int udpSocket; const int port = 4000; @@ -43,9 +43,8 @@ UdpDiscovery::UdpDiscovery(std::string interface) { std::wcout << "Listening on UDP port " << port << std::endl; while (true) { // Get UDP Discovery packet - tabnet::Packet masterIP = tabnet::receiveMessage(udpSocket); - if (masterIP.method == METHODS::ip) { - if (masterIP.payload.length() != 0 && tabnet::isValidIpV4(masterIP.payload)) { + std::string masterIP = receiveMessage(udpSocket); + if (serverSessionController.isValidIpV4(masterIP)) { // DEBUG ONLY: //std::wcout << masterIP.c_str() << std::endl; @@ -59,7 +58,7 @@ UdpDiscovery::UdpDiscovery(std::string interface) { std::wcout << "Socket creation error" << std::endl; continue; } - if (inet_pton(AF_INET, masterIP.payload.c_str(), &masterAddress.sin_addr) <= 0) { + if (inet_pton(AF_INET, masterIP.c_str(), &masterAddress.sin_addr) <= 0) { std::wcout << "Address not supported" << std::endl; continue; } @@ -68,16 +67,44 @@ UdpDiscovery::UdpDiscovery(std::string interface) { continue; } //send(recieveSocket, containerIP.c_str(), containerIP.size(), 0); - tabnet::sendMessage(recieveSocket, METHODS::ip, containerIP.c_str()); + int result = sendMessage(recieveSocket, containerIP.c_str()); close(recieveSocket); - } else { - std::wcout << "Invalid ip!" << std::endl; - } } else { - std::wcout << "Expected" << METHODS::ip << " (ip) but got: " << masterIP.method << std::endl; + std::wcout << "Invalid ip!" << std::endl; } } close(udpSocket); } -*/ +std::string UdpDiscovery::receiveMessage(int socket) { + std::string data; + pollfd pfd{}; + pfd.fd = socket; + pfd.events = POLLIN; + + int ret = poll(&pfd, 1, 10000); + + int bufferSize = 1024; + if (ret > 0 && (pfd.revents & POLLIN)) { + char* buffer = new char[bufferSize]; + ssize_t size = recv(socket, buffer, bufferSize, 0); + + std::wcout << "BUffer: "<< buffer << std::endl; + + data = buffer; + + if (size <= 0) return data; + return data; + } + return data; +} + +int UdpDiscovery::sendMessage(int socket, std::string payload) { + if (send(socket, payload.data(), payload.size(), 0) < 0) { + std::wcout << "buffer: Send Failed!" << std::endl; + return -1; + } + + return 0; +} + diff --git a/TabloNode/src/utils/udp_discovery.h b/TabloNode/src/utils/udp_discovery.h index 62dde08..20d25e5 100644 --- a/TabloNode/src/utils/udp_discovery.h +++ b/TabloNode/src/utils/udp_discovery.h @@ -7,6 +7,10 @@ class UdpDiscovery { public: UdpDiscovery(std::string interface); + + private: + std::string receiveMessage(int socket); + int sendMessage(int socket, std::string payload); }; #endif diff --git a/flake.lock b/flake.lock index f381f3f..5c0f3c8 100644 --- a/flake.lock +++ b/flake.lock @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1778932947, - "narHash": "sha256-XP1M5EFjP4KpGlSpSMJp8k/7Ulhm6+Pb9xOByZxPEdk=", + "lastModified": 1778953537, + "narHash": "sha256-Q7Uv3SVxBqEXLOE57XLjm8VnnIq2pTH/3WhZcdtKd0Y=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "e88cc71a6b36d5f99958f28828e2202ec0b887e0", + "rev": "2bf536ed952fdc54741153b895911ac7ecac9cd1", "type": "github" }, "original": { From bbe51d1242d47f7aa052f73753d851ebe312c395 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sun, 17 May 2026 12:29:52 +0200 Subject: [PATCH 26/64] update: prepare to test updDiscovery --- TabloMaster/src/tabloMaster.cpp | 29 +++++++++++++++++++---------- TabloNode/src/tabloNode.cpp | 23 +++++++++++++---------- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/TabloMaster/src/tabloMaster.cpp b/TabloMaster/src/tabloMaster.cpp index 06c5ec3..18fd3da 100644 --- a/TabloMaster/src/tabloMaster.cpp +++ b/TabloMaster/src/tabloMaster.cpp @@ -1,21 +1,30 @@ #include #include +#include "utils/udp_discovery.h" #include "utils/network_manager.h" int main(int argc, char *argv[]) { std::wcout << "Tablo Master" << std::endl; - if (argc > 0) { - for(int index = 0; index < argc; index++) { - if (std::string(argv[index]).rfind("--interface", 0) == 0) { - NetworkManager networkManager(argv[index+1]); - } - } - } else { - // Use config file to set Interface (TODO) - NetworkManager networkManager("eth0"); - } + UdpDiscovery udpDiscovery; + + udpDiscovery.udpDiscoveryCycle("enp39s0"); + // if (argc > 0) { + // for(int index = 0; index < argc; index++) { + // if (std::string(argv[index]).rfind("--interface", 0) == 0) { + // NetworkManager networkManager(argv[index+1]); + // } + // } + // } else { + // std::wcout << "HELLO WORLD!" << std::endl; + // // Use config file to set Interface (TODO) + // // NetworkManager networkManager("eth0"); + // // TEST: udp discovery + // UdpDiscovery udpDiscovery; + + // udpDiscovery.udpDiscoveryCycle("enp39s0"); + // } return 0; } diff --git a/TabloNode/src/tabloNode.cpp b/TabloNode/src/tabloNode.cpp index 70ca456..aee6fd7 100644 --- a/TabloNode/src/tabloNode.cpp +++ b/TabloNode/src/tabloNode.cpp @@ -2,6 +2,7 @@ #include //#include "utils/networking.h" +#include "utils/udp_discovery.h" int main(int argc, char *argv[]) { @@ -9,16 +10,18 @@ int main(int argc, char *argv[]) signal(SIGPIPE, SIG_IGN); std::wcout << "Tablo Node" << std::endl; - if (argc > 0) { - for(int index = 0; index < argc; index++) { - if (std::string(argv[index]).rfind("--interface", 0) == 0) { - //Networking networking(argv[index+1]); - } - } - } else { - // Use config file to set Interface (TODO) - //Networking networking("eth0"); - } + UdpDiscovery udpDiscovery("enp39s0"); + // if (argc > 0) { + // for(int index = 0; index < argc; index++) { + // if (std::string(argv[index]).rfind("--interface", 0) == 0) { + // //Networking networking(argv[index+1]); + // } + // } + // } else { + // // Use config file to set Interface (TODO) + // //Networking networking("eth0"); + // UdpDiscovery udpDiscovery("enp39s0"); + // } return 0; } From 221de4ea4e5d3ea01b7c09fa2eefc9fb5b28bcc0 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sun, 17 May 2026 12:32:39 +0200 Subject: [PATCH 27/64] update: remove unnecessary log messages --- TabloMaster/src/utils/udp_discovery.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/TabloMaster/src/utils/udp_discovery.cpp b/TabloMaster/src/utils/udp_discovery.cpp index 43940a2..ee48762 100644 --- a/TabloMaster/src/utils/udp_discovery.cpp +++ b/TabloMaster/src/utils/udp_discovery.cpp @@ -159,8 +159,6 @@ std::string UdpDiscovery::receiveMessage(int socket) { if (ret > 0 && (pfd.revents & POLLIN)) { char* buffer = new char[bufferSize]; ssize_t size = recv(socket, buffer, bufferSize, 0); - - std::wcout << "BUffer: "<< buffer << std::endl; data = buffer; From 798bb9388269a9781ca4deb89669fb30aaecfe9a Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sun, 17 May 2026 13:46:06 +0200 Subject: [PATCH 28/64] update: revert test udpdiscovery --- TabloMaster/src/tabloMaster.cpp | 28 ++++++++--------------- TabloMaster/src/utils/network_manager.cpp | 16 +++++++++---- TabloMaster/src/utils/network_manager.h | 6 ++--- TabloNode/src/utils/udp_discovery.cpp | 3 --- 4 files changed, 24 insertions(+), 29 deletions(-) diff --git a/TabloMaster/src/tabloMaster.cpp b/TabloMaster/src/tabloMaster.cpp index 18fd3da..b5a1174 100644 --- a/TabloMaster/src/tabloMaster.cpp +++ b/TabloMaster/src/tabloMaster.cpp @@ -1,30 +1,22 @@ #include #include -#include "utils/udp_discovery.h" #include "utils/network_manager.h" int main(int argc, char *argv[]) { std::wcout << "Tablo Master" << std::endl; - UdpDiscovery udpDiscovery; - udpDiscovery.udpDiscoveryCycle("enp39s0"); - // if (argc > 0) { - // for(int index = 0; index < argc; index++) { - // if (std::string(argv[index]).rfind("--interface", 0) == 0) { - // NetworkManager networkManager(argv[index+1]); - // } - // } - // } else { - // std::wcout << "HELLO WORLD!" << std::endl; - // // Use config file to set Interface (TODO) - // // NetworkManager networkManager("eth0"); - // // TEST: udp discovery - // UdpDiscovery udpDiscovery; - - // udpDiscovery.udpDiscoveryCycle("enp39s0"); - // } + if (argc > 0) { + for(int index = 0; index < argc; index++) { + if (std::string(argv[index]).rfind("--interface", 0) == 0) { + NetworkManager networkManager(argv[index+1]); + } + } + } else { + // Use config file to set Interface (TODO) + NetworkManager networkManager("eth0"); + } return 0; } diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index e7d25fe..4a87484 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -1,7 +1,7 @@ -// #include "udp_discovery.h" - #include "network_manager.h" +#include "udp_discovery.h" + #include #include @@ -14,7 +14,7 @@ NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start socket..." << std::endl; - // udpDiscoveryThread = std::thread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); + std::thread udpDiscoveryThread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); ServerSessionController tempServerSessionController; std::string containerIP = tempServerSessionController.getLocalIpAddress(interface); @@ -62,11 +62,17 @@ NetworkManager::NetworkManager(std::string interface) { } } } - // TODO: Implement accept client here } void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { std::wcout << "Handle client conn" << std::endl; + + std::vector nodes = udpDiscovery.getNodeAdresses(); + for (int index = 0; index < nodes.size(); index++) { + std::wcout << "node: " << nodes[index].c_str() << std::endl; + } + + // TODO: add packet distribution logic here auto serverSessionController = std::make_shared(serverSocket, clientSocket); @@ -86,5 +92,5 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) std::wcout << "Terminated!" << std::endl; networkingSession.detach(); - // udpDiscoveryThread.join(); + udpDiscoveryThread.join(); } diff --git a/TabloMaster/src/utils/network_manager.h b/TabloMaster/src/utils/network_manager.h index 29dc302..3052086 100644 --- a/TabloMaster/src/utils/network_manager.h +++ b/TabloMaster/src/utils/network_manager.h @@ -4,7 +4,7 @@ #include #include -// #include "udp_discovery.h" +#include "udp_discovery.h" class NetworkManager { @@ -13,8 +13,8 @@ class NetworkManager void handleClientConnection(int serverSocket, int clientSocket); private: - // UdpDiscovery udpDiscovery; - // std::thread udpDiscoveryThread; + UdpDiscovery udpDiscovery; + std::thread udpDiscoveryThread; }; #endif diff --git a/TabloNode/src/utils/udp_discovery.cpp b/TabloNode/src/utils/udp_discovery.cpp index 2b00709..4ba4287 100644 --- a/TabloNode/src/utils/udp_discovery.cpp +++ b/TabloNode/src/utils/udp_discovery.cpp @@ -88,9 +88,6 @@ std::string UdpDiscovery::receiveMessage(int socket) { if (ret > 0 && (pfd.revents & POLLIN)) { char* buffer = new char[bufferSize]; ssize_t size = recv(socket, buffer, bufferSize, 0); - - std::wcout << "BUffer: "<< buffer << std::endl; - data = buffer; if (size <= 0) return data; From f22b911c46ebb1f2e4cd8eea3277d67d2a4cfe71 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Sun, 17 May 2026 14:17:58 +0200 Subject: [PATCH 29/64] update: implement TTP2 in node --- TabloNode/src/tabloNode.cpp | 30 ++--- TabloNode/src/utils/network_manager.cpp | 109 ++++++++++++++++ .../utils/{networking.h => network_manager.h} | 8 +- TabloNode/src/utils/networking.cpp | 118 ------------------ TabloNode/src/utils/worker.cpp | 52 +++----- TabloNode/src/utils/worker.h | 22 ++-- 6 files changed, 154 insertions(+), 185 deletions(-) create mode 100644 TabloNode/src/utils/network_manager.cpp rename TabloNode/src/utils/{networking.h => network_manager.h} (77%) delete mode 100644 TabloNode/src/utils/networking.cpp diff --git a/TabloNode/src/tabloNode.cpp b/TabloNode/src/tabloNode.cpp index aee6fd7..b5d9c62 100644 --- a/TabloNode/src/tabloNode.cpp +++ b/TabloNode/src/tabloNode.cpp @@ -1,27 +1,21 @@ #include #include -//#include "utils/networking.h" -#include "utils/udp_discovery.h" +#include "utils/network_manager.h" int main(int argc, char *argv[]) -{ - // Prevents crash when tcp send failes - signal(SIGPIPE, SIG_IGN); - +{ std::wcout << "Tablo Node" << std::endl; - UdpDiscovery udpDiscovery("enp39s0"); - // if (argc > 0) { - // for(int index = 0; index < argc; index++) { - // if (std::string(argv[index]).rfind("--interface", 0) == 0) { - // //Networking networking(argv[index+1]); - // } - // } - // } else { - // // Use config file to set Interface (TODO) - // //Networking networking("eth0"); - // UdpDiscovery udpDiscovery("enp39s0"); - // } + if (argc > 0) { + for(int index = 0; index < argc; index++) { + if (std::string(argv[index]).rfind("--interface", 0) == 0) { + NetworkManager networkManager(argv[index+1]); + } + } + } else { + // Use config file to set Interface (TODO) + NetworkManager networking("eth0"); + } return 0; } diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp new file mode 100644 index 0000000..fffe63f --- /dev/null +++ b/TabloNode/src/utils/network_manager.cpp @@ -0,0 +1,109 @@ +#include "network_manager.h" + +#include + +#include "udp_discovery.h" +#include "worker.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +NetworkManager::NetworkManager(std::string interface) { + std::wcout << "Start Socket...." << std::endl; + ServerSessionController serverSessionController; + + std::string containerIP = serverSessionController.getLocalIpAddress(interface); + + udpThread = std::thread(&NetworkManager::handleUdpDiscovery, this, interface); + + sockaddr_in serverAddress; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(4004); + serverAddress.sin_addr.s_addr = inet_addr(containerIP.c_str()); + + int serverSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + if(bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)) < 0) { + std::wcout << "Bind failed!" << std::endl; + return; + } + + // Create epoll + int epollFd = epoll_create1(0); + if (epollFd == -1) { + std::wcout << "Failed to create epoll!" << std::endl; + } + // Set epoll action for server + struct epoll_event serverEvents; + serverEvents.events = EPOLLIN | EPOLLOUT; + serverEvents.data.fd = serverSocket; + if (epoll_ctl(epollFd, EPOLL_CTL_ADD, serverSocket, &serverEvents) == -1) { + std::wcout << "Failed to set epoll_ctl!" << std::endl; + return; + } + + listen(serverSocket, 5); + std::vector clientConnections; + while (true) { + const int MAX_EVENTS = 10; + struct epoll_event events[MAX_EVENTS]; + int epollRequestCount = epoll_wait(epollFd, events, MAX_EVENTS, -1); + + for (int index = 0; index < epollRequestCount; ++index) { + if (events[index].data.fd == serverSocket) { + int clientSocket = accept4(serverSocket, nullptr, nullptr, SOCK_NONBLOCK); + std::wcout << "New clientSocket: " << clientSocket << std::endl; + + clientConnections.push_back(std::thread([this, serverSocket, clientSocket]() { + this->handleClientConnection(serverSocket, clientSocket); + })); + } + } + } + + std::wcout << "Terminated!" << std::endl; + + for (auto &socketThread : clientConnections) { + if (socketThread.joinable()) { + socketThread.join(); + } + } + + if (udpThread.joinable()) { + udpThread.join(); + } +} + +void NetworkManager::handleUdpDiscovery(std::string interface) { + UdpDiscovery udpDiscovery(interface); +} + +void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { + auto serverSessionController = std::make_shared(serverSocket, clientSocket); + + std::thread networkingSession([serverSessionController]() { + serverSessionController->networkingSession(); + }); + + Worker worker; + std::thread workerThread = std::thread(&Worker::solveOrderCycle, &worker); + + while (serverSessionController->isConnected()) { + if (serverSessionController->hasRequest()) { + std::wcout << "Received Request!" << std::endl; + worker.pushOrder(serverSessionController->popRequest()); + } + + while (worker.getSolutionCollectionSize() > 0) { + std::wcout << "Hand back Solution" << std::endl; + serverSessionController->pushResponse(worker.getSolution()); + } + } +} + diff --git a/TabloNode/src/utils/networking.h b/TabloNode/src/utils/network_manager.h similarity index 77% rename from TabloNode/src/utils/networking.h rename to TabloNode/src/utils/network_manager.h index fc35c93..2a83848 100644 --- a/TabloNode/src/utils/networking.h +++ b/TabloNode/src/utils/network_manager.h @@ -1,5 +1,5 @@ -#ifndef NETWORKING_H -#define NETWORKING_H +#ifndef NETWORK_MANAGER_H +#define NETWORK_MANAGER_H #include #include @@ -8,10 +8,10 @@ #include #include -class Networking +class NetworkManager { public: - Networking(std::string interface); + NetworkManager(std::string interface); void handleUdpDiscovery(std::string interface); void handleClientConnection(int serverSocket, int clientSocket); diff --git a/TabloNode/src/utils/networking.cpp b/TabloNode/src/utils/networking.cpp deleted file mode 100644 index bd0d29c..0000000 --- a/TabloNode/src/utils/networking.cpp +++ /dev/null @@ -1,118 +0,0 @@ -#include "networking.h" - -#include "tabnet.h" - -#include "udp_discovery.h" -#include "worker.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* -Networking::Networking(std::string interface) { - std::wcout << "Start Socket...." << std::endl; - - std::string containerIP = tabnet::getLocalIpAddress(interface); - - udpThread = std::thread(&Networking::handleUdpDiscovery, this, interface); - - sockaddr_in serverAddress; - serverAddress.sin_family = AF_INET; - serverAddress.sin_port = htons(4004); - serverAddress.sin_addr.s_addr = inet_addr(containerIP.c_str()); - - int serverSocket = socket(AF_INET, SOCK_STREAM, 0); - bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress)); - - // On new request: make new worker thread - threadCollection.reserve(100); - listen(serverSocket, 5); - while (true) { - int clientSocket = accept(serverSocket, nullptr, nullptr); - std::wcout << "clientSocket: " << clientSocket << std::endl; - threadCollection.push_back(std::thread(&Networking::handleClientConnection, - this, serverSocket, clientSocket)); - } - - std::wcout << "Terminated!" << std::endl; - - for (auto &socketThread : threadCollection) { - if (socketThread.joinable()) { - socketThread.join(); - } - } - - if (udpThread.joinable()) { - udpThread.join(); - } -} - -void Networking::handleUdpDiscovery(std::string interface) { - UdpDiscovery udpDiscovery(interface); -} - -void Networking::handleClientConnection(int serverSocket, int clientSocket) { - Worker worker; - std::thread workerThread = std::thread(&Worker::solveOrderCycle, &worker); - - // Compleate Handshake - int responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); - - while (true) { - // Hand back finished solution - int solutionCollectionSize = worker.getSolutionCollectionSize(); - responseCode = tabnet::sendMessage(clientSocket, METHODS::size, std::to_string(solutionCollectionSize)); - tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method == METHODS::success) { - for(int index = 0; index < solutionCollectionSize; index++) { - // Send data - tabnet::Packet solution = worker.getSolution(); - responseCode = tabnet::sendPacket(clientSocket, solution); - tabnet::Packet response = tabnet::receiveMessage(clientSocket); - if (response.method != METHODS::success) { - std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; - std::wcout << "With following payload" << response.payload.c_str() << std::endl; - } - } - } else if (response.method == METHODS::failed) { - std::wcout << "Something went wrong while sending the size! Master response: " << response.payload.c_str() << std::endl; - } else { - std::wcout << "Expected: " << METHODS::success << " (success) or " << METHODS::failed << " (failed), but got " << response.method << std::endl; - std::wcout << "With following payload" << response.payload.c_str() << std::endl; - } - - responseCode = tabnet::sendMessage(clientSocket, METHODS::ready, ""); - - //receive - tabnet::Packet receivedPacket = tabnet::receiveMessage(clientSocket); - if (receivedPacket.method == METHODS::size) { - int count = std::stoi(receivedPacket.payload); - if (count != 0) { - responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); - for(int i = 0; i < count; i++) { - tabnet::Packet order = tabnet::receiveMessage(clientSocket); - worker.pushOrder(order); - responseCode = tabnet::sendMessage(clientSocket, METHODS::success, ""); - } - } - } else { - std::wcout << "Expected: " << METHODS::size << " (size) got: " << receivedPacket.method << std::endl; - responseCode = tabnet::sendMessage(clientSocket, METHODS::failed, "Expected method size"); - } - - // Controlled shutdown of this thread, if the master crashes - if (responseCode < 0) { - std::wcout << "Socket: " << clientSocket << " closed!" << std::endl; - close(clientSocket); - return; - } - } -} -*/ diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 955b7e0..0c88ec6 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -1,34 +1,23 @@ #include "worker.h" -#include +#include + +#include #include #include - // Cycle -/* void Worker::solveOrderCycle() { while (true) { int orderSize = getOrderCollectionSize(); if (orderSize > 0) { for (int count; count < orderSize; count++) { - tabnet::Packet order = getOrder(); + ServerSessionController::Packet order = getOrder(); - switch (order.method) { - case METHODS::test: + if (std::holds_alternative(order.payload)) { pushSolution(Worker::test(order)); - break; - - case METHODS::setFile: - pushSolution(Worker::setFile(order)); - break; - - case METHODS::empty: - break; - - default: - std::wcout << "Unknown action: " << order.method << " -> Expected a method between " << METHODS::START << " and " << METHODS::END << std::endl; - break; + } else { + std::wcout << "Unknown payload type!" << std::endl; } } } @@ -36,47 +25,43 @@ void Worker::solveOrderCycle() { } // Logic functions -tabnet::Packet Worker::test(tabnet::Packet packet) { - tabnet::Packet solution; - solution.method = METHODS::response; - solution.payload = packet.payload; - return solution; +ServerSessionController::Packet Worker::test(ServerSessionController::Packet packet) { + return packet; } -tabnet::Packet Worker::setFile(tabnet::Packet packet) { +ServerSessionController::Packet Worker::setFile(ServerSessionController::Packet packet) { return packet; } // Service logic -tabnet::Packet Worker::getOrder() { +ServerSessionController::Packet Worker::getOrder() { std::lock_guard lock(mtx); if (!orders.empty()) { - tabnet::Packet firstOrder = orders[0]; + ServerSessionController::Packet firstOrder = orders[0]; orders.erase(orders.begin()); return firstOrder; } - tabnet::Packet emptyPacket; - emptyPacket.method = METHODS::empty; + ServerSessionController::Packet emptyPacket; return emptyPacket; } -void Worker::pushOrder(tabnet::Packet packet) { +void Worker::pushOrder(ServerSessionController::Packet packet) { std::lock_guard lock(mtx); orders.push_back(packet); } -tabnet::Packet Worker::getSolution() { +ServerSessionController::Packet Worker::getSolution() { std::lock_guard lock(mtx); if (!solutions.empty()) { - tabnet::Packet firstSolution = solutions[0]; + ServerSessionController::Packet firstSolution = solutions[0]; solutions.erase(solutions.begin()); return firstSolution; } - tabnet::Packet emptyPacket; + ServerSessionController::Packet emptyPacket; return emptyPacket; } -void Worker::pushSolution(tabnet::Packet packet) { +void Worker::pushSolution(ServerSessionController::Packet packet) { std::lock_guard lock(mtx); solutions.push_back(packet); } @@ -90,4 +75,3 @@ int Worker::getOrderCollectionSize() { std::lock_guard lock(mtx); return orders.size(); } -*/ diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index f722e20..bec1d82 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -1,11 +1,11 @@ #ifndef WORKER_H #define WORKER_H +#include + #include #include -#include "tabnet.h" -/* class Worker { public: @@ -13,23 +13,23 @@ class Worker void solveOrderCycle(); // Logic functions - tabnet::Packet test(tabnet::Packet packet); - tabnet::Packet setFile(tabnet::Packet packet); + ServerSessionController::Packet test(ServerSessionController::Packet packet); + ServerSessionController::Packet setFile(ServerSessionController::Packet packet); // Service logic - tabnet::Packet getOrder(); - void pushOrder(tabnet::Packet packet); + ServerSessionController::Packet getOrder(); + void pushOrder(ServerSessionController::Packet packet); - tabnet::Packet getSolution(); - void pushSolution(tabnet::Packet packet); + ServerSessionController::Packet getSolution(); + void pushSolution(ServerSessionController::Packet packet); int getSolutionCollectionSize(); int getOrderCollectionSize(); private: std::mutex mtx; - std::vector solutions; - std::vector orders; + std::vector solutions; + std::vector orders; }; -*/ + #endif From ea99f4796c113bcfaca13fcc5fdbdd6d6c88dec4 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 18 May 2026 15:31:35 +0200 Subject: [PATCH 30/64] update: establish conn to node --- TabloMaster/src/utils/network_manager.cpp | 72 +++++++++++++++++++---- TabloMaster/src/utils/network_manager.h | 7 +++ 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 4a87484..2ab96b7 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -3,10 +3,12 @@ #include "udp_discovery.h" #include +#include #include #include #include +#include #include #include #include @@ -66,29 +68,73 @@ NetworkManager::NetworkManager(std::string interface) { void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { std::wcout << "Handle client conn" << std::endl; - - std::vector nodes = udpDiscovery.getNodeAdresses(); - for (int index = 0; index < nodes.size(); index++) { - std::wcout << "node: " << nodes[index].c_str() << std::endl; - } - + std::vector nodeConnections; - // TODO: add packet distribution logic here - auto serverSessionController = std::make_shared(serverSocket, clientSocket); std::thread networkingSession([serverSessionController]() { serverSessionController->networkingSession(); }); - while (serverSessionController->isConnected()) { - if (serverSessionController->hasRequest()) { - ServerSessionController::Packet packet = serverSessionController->popRequest(); - std::wcout << "Received packet id: " << packet.id << std::endl; - serverSessionController->pushResponse(packet); + while(serverSessionController->isConnected()) { + // Establish new node connections + std::vector discoveredNodes = udpDiscovery.getNodeAdresses(); + + for (int newNodeIndex = 0; newNodeIndex < discoveredNodes.size(); newNodeIndex++) { + bool isNew = true; + for (int index = 0; index < nodeConnections.size(); index++) { + if (nodeConnections[index].ip == discoveredNodes[index]) { + isNew = false; + } + } + + if (isNew) { + std::wcout << "Create new conn!" << std::endl; + std::string nodeIpv4 = discoveredNodes[newNodeIndex]; + + int nodeSocket = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0); + + sockaddr_in nodeAddress; + nodeAddress.sin_family = AF_INET; + nodeAddress.sin_port = htons(4004); + nodeAddress.sin_addr.s_addr = inet_addr(nodeIpv4.c_str()); + + int connectionResult = connect(nodeSocket, (struct sockaddr*) &nodeAddress, sizeof(nodeAddress)); + + // Wait for server to accept + if (connectionResult < 0 && errno != EINPROGRESS) { + std::wcout << "Connection failed!" << std::endl; + continue; + } + + std::shared_ptr clientSessionController = std::make_shared(nodeSocket); + + std::thread networkThread([clientSessionController]() { + clientSessionController->networkingSession(); + }); + networkThread.detach(); + + Nodes newNode = {nodeIpv4, clientSessionController}; + nodeConnections.push_back(newNode); + std::wcout << "Done!" << std::endl; + } + } + + // Handle common business + while (serverSessionController->isConnected()) { + if (serverSessionController->hasRequest()) { + ServerSessionController::Packet packet = serverSessionController->popRequest(); + std::wcout << "Received packet id: " << packet.id << std::endl; + serverSessionController->pushResponse(packet); + } } } + // Disconnect node conns if client disconnects + for (int index = 0; index < nodeConnections.size(); index++) { + nodeConnections[index].node->disconnect(); + } + std::wcout << "Terminated!" << std::endl; networkingSession.detach(); diff --git a/TabloMaster/src/utils/network_manager.h b/TabloMaster/src/utils/network_manager.h index 3052086..867aa2f 100644 --- a/TabloMaster/src/utils/network_manager.h +++ b/TabloMaster/src/utils/network_manager.h @@ -1,6 +1,8 @@ #ifndef NETWORK_MANAGER_H #define NETWORK_MANAGER_H +#include +#include #include #include @@ -13,6 +15,11 @@ class NetworkManager void handleClientConnection(int serverSocket, int clientSocket); private: + struct Nodes { + std::string ip; + std::shared_ptr node; + }; + UdpDiscovery udpDiscovery; std::thread udpDiscoveryThread; }; From 4eb962fe4db588a997c4f11a76b656de98eab300 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 18 May 2026 15:36:51 +0200 Subject: [PATCH 31/64] update: handle node disconnect --- TabloMaster/src/utils/network_manager.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 2ab96b7..142bcf9 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -120,6 +120,13 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) } } + // Remove disconnected nodes + for (int index = 0; index < nodeConnections.size(); index++) { + if(!nodeConnections[index].node->isConnected()) { + nodeConnections.erase(nodeConnections.begin() + index); + } + } + // Handle common business while (serverSessionController->isConnected()) { if (serverSessionController->hasRequest()) { From 5958f7ced5d4c892826f573386a6657c90b4f3e6 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 18 May 2026 15:47:24 +0200 Subject: [PATCH 32/64] update: implement distribution logic --- TabloMaster/src/utils/network_manager.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 142bcf9..6d27552 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -123,16 +123,28 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) // Remove disconnected nodes for (int index = 0; index < nodeConnections.size(); index++) { if(!nodeConnections[index].node->isConnected()) { + std::wcout << "node with ip: " << nodeConnections[index].ip.c_str() << " disconnected!" << std::endl; nodeConnections.erase(nodeConnections.begin() + index); } } // Handle common business - while (serverSessionController->isConnected()) { - if (serverSessionController->hasRequest()) { - ServerSessionController::Packet packet = serverSessionController->popRequest(); - std::wcout << "Received packet id: " << packet.id << std::endl; - serverSessionController->pushResponse(packet); + // WARNING: This is only temporary. The distribution logic has to be rewritten later + + // Send request + if (serverSessionController->hasRequest()) { + ServerSessionController::Packet packet = serverSessionController->popRequest(); + std::wcout << "Received packet id: " << packet.id << std::endl; + + for (int index = 0; index < nodeConnections.size(); index++) { + nodeConnections[index].node->pushRequest(packet); + } + } + + // Receive response + for (int index = 0; index < nodeConnections.size(); index++) { + while(nodeConnections[index].node->hasResponse()) { + serverSessionController->pushResponse(nodeConnections[index].node->popResponse()); } } } From 1a4c1ad63216d7696bc2d819db57507792ddc9a2 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 18 May 2026 17:52:37 +0200 Subject: [PATCH 33/64] update: rename order >> request --- TabloNode/src/utils/network_manager.cpp | 4 ++-- TabloNode/src/utils/worker.cpp | 32 ++++++++++++------------- TabloNode/src/utils/worker.h | 10 ++++---- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp index fffe63f..96b74c7 100644 --- a/TabloNode/src/utils/network_manager.cpp +++ b/TabloNode/src/utils/network_manager.cpp @@ -92,12 +92,12 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) }); Worker worker; - std::thread workerThread = std::thread(&Worker::solveOrderCycle, &worker); + std::thread workerThread = std::thread(&Worker::solveRequestCycle, &worker); while (serverSessionController->isConnected()) { if (serverSessionController->hasRequest()) { std::wcout << "Received Request!" << std::endl; - worker.pushOrder(serverSessionController->popRequest()); + worker.pushRequest(serverSessionController->popRequest()); } while (worker.getSolutionCollectionSize() > 0) { diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 0c88ec6..b3dc4c7 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -7,15 +7,15 @@ #include // Cycle -void Worker::solveOrderCycle() { +void Worker::solveRequestCycle() { while (true) { - int orderSize = getOrderCollectionSize(); - if (orderSize > 0) { - for (int count; count < orderSize; count++) { - ServerSessionController::Packet order = getOrder(); + int requestSize = getRequestCollectionSize(); + if (requestSize > 0) { + for (int count; count < requestSize; count++) { + ServerSessionController::Packet request = getRequest(); - if (std::holds_alternative(order.payload)) { - pushSolution(Worker::test(order)); + if (std::holds_alternative(request.payload)) { + pushSolution(Worker::test(request)); } else { std::wcout << "Unknown payload type!" << std::endl; } @@ -34,20 +34,20 @@ ServerSessionController::Packet Worker::setFile(ServerSessionController::Packet } // Service logic -ServerSessionController::Packet Worker::getOrder() { +ServerSessionController::Packet Worker::getRequest() { std::lock_guard lock(mtx); - if (!orders.empty()) { - ServerSessionController::Packet firstOrder = orders[0]; - orders.erase(orders.begin()); - return firstOrder; + if (!requests.empty()) { + ServerSessionController::Packet firstRequest = requests[0]; + requests.erase(requests.begin()); + return firstRequest; } ServerSessionController::Packet emptyPacket; return emptyPacket; } -void Worker::pushOrder(ServerSessionController::Packet packet) { +void Worker::pushRequest(ServerSessionController::Packet packet) { std::lock_guard lock(mtx); - orders.push_back(packet); + requests.push_back(packet); } ServerSessionController::Packet Worker::getSolution() { @@ -71,7 +71,7 @@ int Worker::getSolutionCollectionSize() { return solutions.size(); } -int Worker::getOrderCollectionSize() { +int Worker::getRequestCollectionSize() { std::lock_guard lock(mtx); - return orders.size(); + return requests.size(); } diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index bec1d82..e670856 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -10,26 +10,26 @@ class Worker { public: // Cycle - void solveOrderCycle(); + void solveRequestCycle(); // Logic functions ServerSessionController::Packet test(ServerSessionController::Packet packet); ServerSessionController::Packet setFile(ServerSessionController::Packet packet); // Service logic - ServerSessionController::Packet getOrder(); - void pushOrder(ServerSessionController::Packet packet); + ServerSessionController::Packet getRequest(); + void pushRequest(ServerSessionController::Packet packet); ServerSessionController::Packet getSolution(); void pushSolution(ServerSessionController::Packet packet); int getSolutionCollectionSize(); - int getOrderCollectionSize(); + int getRequestCollectionSize(); private: std::mutex mtx; std::vector solutions; - std::vector orders; + std::vector requests; }; #endif From 49c1f873df65875c9fb6d156dc7ac5a3167ad243 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 18 May 2026 17:57:48 +0200 Subject: [PATCH 34/64] update: rename solution >> response --- TabloNode/src/utils/network_manager.cpp | 6 +++--- TabloNode/src/utils/worker.cpp | 20 ++++++++++---------- TabloNode/src/utils/worker.h | 8 ++++---- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp index 96b74c7..8cb210b 100644 --- a/TabloNode/src/utils/network_manager.cpp +++ b/TabloNode/src/utils/network_manager.cpp @@ -100,9 +100,9 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) worker.pushRequest(serverSessionController->popRequest()); } - while (worker.getSolutionCollectionSize() > 0) { - std::wcout << "Hand back Solution" << std::endl; - serverSessionController->pushResponse(worker.getSolution()); + while (worker.getResponseCollectionSize() > 0) { + std::wcout << "Hand back Response" << std::endl; + serverSessionController->pushResponse(worker.getResponse()); } } } diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index b3dc4c7..c9db07b 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -15,7 +15,7 @@ void Worker::solveRequestCycle() { ServerSessionController::Packet request = getRequest(); if (std::holds_alternative(request.payload)) { - pushSolution(Worker::test(request)); + pushResponse(Worker::test(request)); } else { std::wcout << "Unknown payload type!" << std::endl; } @@ -50,25 +50,25 @@ void Worker::pushRequest(ServerSessionController::Packet packet) { requests.push_back(packet); } -ServerSessionController::Packet Worker::getSolution() { +ServerSessionController::Packet Worker::getResponse() { std::lock_guard lock(mtx); - if (!solutions.empty()) { - ServerSessionController::Packet firstSolution = solutions[0]; - solutions.erase(solutions.begin()); - return firstSolution; + if (!responses.empty()) { + ServerSessionController::Packet firstResponse = responses[0]; + responses.erase(responses.begin()); + return firstResponse; } ServerSessionController::Packet emptyPacket; return emptyPacket; } -void Worker::pushSolution(ServerSessionController::Packet packet) { +void Worker::pushResponse(ServerSessionController::Packet packet) { std::lock_guard lock(mtx); - solutions.push_back(packet); + responses.push_back(packet); } -int Worker::getSolutionCollectionSize() { +int Worker::getResponseCollectionSize() { std::lock_guard lock(mtx); - return solutions.size(); + return responses.size(); } int Worker::getRequestCollectionSize() { diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index e670856..94d18d9 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -20,15 +20,15 @@ class Worker ServerSessionController::Packet getRequest(); void pushRequest(ServerSessionController::Packet packet); - ServerSessionController::Packet getSolution(); - void pushSolution(ServerSessionController::Packet packet); + ServerSessionController::Packet getResponse(); + void pushResponse(ServerSessionController::Packet packet); - int getSolutionCollectionSize(); + int getResponseCollectionSize(); int getRequestCollectionSize(); private: std::mutex mtx; - std::vector solutions; + std::vector responses; std::vector requests; }; From 45863c358d3bbbd502d5903e2724522abb3d1de4 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 18 May 2026 18:09:42 +0200 Subject: [PATCH 35/64] update: fix node sending back empty packages --- TabloNode/src/utils/worker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index c9db07b..0166764 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -11,7 +11,7 @@ void Worker::solveRequestCycle() { while (true) { int requestSize = getRequestCollectionSize(); if (requestSize > 0) { - for (int count; count < requestSize; count++) { + for (int count = 0; count < requestSize; count++) { ServerSessionController::Packet request = getRequest(); if (std::holds_alternative(request.payload)) { From 0c014372840e2f5353604f2d486b1e7736017c72 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Mon, 1 Jun 2026 21:43:37 +0200 Subject: [PATCH 36/64] update: add --file as commandline argument to cli --- TabloClient/src/tabloClient.cpp | 13 +++++++++++-- TabloClient/src/utils/argv_struct.h | 11 +++++++++++ TabloClient/src/utils/cli.cpp | 10 +++++++++- TabloClient/src/utils/cli.h | 5 +++-- 4 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 TabloClient/src/utils/argv_struct.h diff --git a/TabloClient/src/tabloClient.cpp b/TabloClient/src/tabloClient.cpp index 32c1080..d76a410 100644 --- a/TabloClient/src/tabloClient.cpp +++ b/TabloClient/src/tabloClient.cpp @@ -3,18 +3,27 @@ #include #include "utils/cli.h" +#include "utils/argv_struct.h" int main(int argc, char *argv[]) { if (argc > 0) { + struct Argv commandLineArguments; + for(int index = 0; index < argc; index++) { if (std::string(argv[index]).rfind("--master", 0) == 0) { - Cli cli(argv[index+1]); + commandLineArguments.tabloMaster = argv[index+1]; + } else if (std::string(argv[index]).rfind("--file", 0) == 0) { + commandLineArguments.filePath = argv[index+1]; } } + + if (commandLineArguments.tabloMaster.length() != 0) { + Cli cli(commandLineArguments); + } } else { // Use config file (TODO) - Cli cli(""); + std::wcout << "failed" << std::endl; } return 0; diff --git a/TabloClient/src/utils/argv_struct.h b/TabloClient/src/utils/argv_struct.h new file mode 100644 index 0000000..e73304c --- /dev/null +++ b/TabloClient/src/utils/argv_struct.h @@ -0,0 +1,11 @@ +#ifndef ARGV_STRUCT_H +#define ARGV_STRUCT_H + +#include + +struct Argv { + std::string tabloMaster; + std::string filePath; +}; + +#endif diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 862e68c..fe4941f 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -7,8 +7,16 @@ #include "network_manager.h" -Cli::Cli(std::string tabloMaster) { +Cli::Cli(struct Argv argv) { + std::string tabloMaster = argv.tabloMaster; + std::string filePath = argv.filePath; + std::wcout << "Client! Tablo master at: " << tabloMaster.c_str() << std::endl; + + if (filePath.length() != 0) { + std::wcout << "FilePath: " << filePath.c_str() << std::endl; + } + NetworkManager networkManager; if (networkManager.createSocket(tabloMaster) < 0) { diff --git a/TabloClient/src/utils/cli.h b/TabloClient/src/utils/cli.h index a1783a4..9057c03 100644 --- a/TabloClient/src/utils/cli.h +++ b/TabloClient/src/utils/cli.h @@ -1,12 +1,13 @@ #ifndef CLI_H #define CLI_H -#include +#include "argv_struct.h" class Cli { public: - Cli(std::string tabloMaster); + Cli(struct Argv argv); + }; #endif From 346a9a36063e5d6abb4833a8f73f84ea203be8e4 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Tue, 2 Jun 2026 10:11:34 +0200 Subject: [PATCH 37/64] update: send file to node the file packet type has to be implemented later --- TabloClient/src/utils/cli.cpp | 26 ++++++++++++++++++++++---- TabloNode/src/utils/udp_discovery.cpp | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index fe4941f..e2cf7ee 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "network_manager.h" @@ -12,10 +13,6 @@ Cli::Cli(struct Argv argv) { std::string filePath = argv.filePath; std::wcout << "Client! Tablo master at: " << tabloMaster.c_str() << std::endl; - - if (filePath.length() != 0) { - std::wcout << "FilePath: " << filePath.c_str() << std::endl; - } NetworkManager networkManager; @@ -23,6 +20,27 @@ Cli::Cli(struct Argv argv) { std::wcout << "Create network manager failed!" << std::endl; return; } + + if (filePath.length() != 0) { + std::wcout << "FilePath: " << filePath.c_str() << std::endl; + std::ifstream file(filePath); + + if (file.is_open()) { + std::string fileContent; + std::string line; + while (std::getline(file, line)) { + fileContent = fileContent + line.c_str() + "\n"; + } + file.close(); + + Networking::Packet packet; + Networking::Standard payload; + payload.payload = fileContent; + packet.payload = payload; + + networkManager.pushRequest(packet); + } + } while (true) { std::string content; diff --git a/TabloNode/src/utils/udp_discovery.cpp b/TabloNode/src/utils/udp_discovery.cpp index 4ba4287..b61e763 100644 --- a/TabloNode/src/utils/udp_discovery.cpp +++ b/TabloNode/src/utils/udp_discovery.cpp @@ -59,7 +59,7 @@ UdpDiscovery::UdpDiscovery(std::string interface) { continue; } if (inet_pton(AF_INET, masterIP.c_str(), &masterAddress.sin_addr) <= 0) { - std::wcout << "Address not supported" << std::endl; + std::wcout << "Address not supported: " << masterIP.c_str() << std::endl; continue; } if (connect(recieveSocket, (struct sockaddr*)&masterAddress, sizeof(masterAddress)) < 0) { From 784ee5dde43f653277d5c0d9117b977ad762d3fa Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Tue, 2 Jun 2026 10:26:37 +0200 Subject: [PATCH 38/64] update: improve cli --- TabloClient/src/utils/cli.cpp | 40 ++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index e2cf7ee..4af9159 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -43,25 +43,35 @@ Cli::Cli(struct Argv argv) { } while (true) { - std::string content; - std::wcout << "Content: "; - std::cin >> content; + std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\noption:"; + std::string option = ""; + std::cin >> option; + if (option == "1") { + std::string content; + std::wcout << "Content: "; + std::cin >> content; - Networking::Packet packet; + Networking::Packet packet; - Networking::Standard payload; - payload.payload = content; - packet.payload = payload; + Networking::Standard payload; + payload.payload = content; + packet.payload = payload; - networkManager.pushRequest(packet); + networkManager.pushRequest(packet); + } else if (option == "2") { + if (networkManager.hasResponse()) { + while (networkManager.hasResponse()) { + ClientSessionController::Packet response = networkManager.popResponse(); + ClientSessionController::Standard responsePayload = std::get(response.payload); - std::wcout << "Waiting for solution..." << std::endl; - while (!networkManager.hasResponse()) {} // Wait for solution - - ClientSessionController::Packet response = networkManager.popResponse(); - ClientSessionController::Standard responsePayload = std::get(response.payload); - - std::wcout << "Response:\nID: " << response.id << "\nPayload: " << responsePayload.payload.c_str() << std::endl; + std::wcout << "Response:\nID: " << response.id << "\nPayload: " << responsePayload.payload.c_str() << std::endl; + } + } else { + std::wcout << "There are currently no packets to read!" << std::endl; + } + } else { + std::wcout << "invalid" << std::endl; + } } } From cdc6943e10400e998c653a2082b8971e38efa203 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Tue, 2 Jun 2026 21:55:43 +0200 Subject: [PATCH 39/64] update: add filetype when sending file WIP --- TabloClient/src/utils/cli.cpp | 26 +++++++++++++++++++++----- TabloNode/src/utils/worker.cpp | 4 +++- flake.lock | 6 +++--- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 4af9159..002cdbd 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "network_manager.h" @@ -28,13 +29,18 @@ Cli::Cli(struct Argv argv) { if (file.is_open()) { std::string fileContent; std::string line; + int lineCount = 0; while (std::getline(file, line)) { - fileContent = fileContent + line.c_str() + "\n"; + lineCount++; + fileContent = fileContent + line.c_str() + "\n"; } file.close(); Networking::Packet packet; - Networking::Standard payload; + Networking::File payload; + payload.filePath = filePath; + payload.start = 0; + payload.end = lineCount; payload.payload = fileContent; packet.payload = payload; @@ -62,9 +68,19 @@ Cli::Cli(struct Argv argv) { if (networkManager.hasResponse()) { while (networkManager.hasResponse()) { ClientSessionController::Packet response = networkManager.popResponse(); - ClientSessionController::Standard responsePayload = std::get(response.payload); - - std::wcout << "Response:\nID: " << response.id << "\nPayload: " << responsePayload.payload.c_str() << std::endl; + + if (std::holds_alternative(response.payload)) { + ClientSessionController::Standard responsePayload = std::get(response.payload); + std::wcout << "Response:\nID: " << response.id << "\nPayload: " << responsePayload.payload.c_str() << std::endl; + } else if (std::holds_alternative(response.payload)) { + ClientSessionController::File responsePayload = std::get(response.payload); + std::wcout << "Response:\nID: " << response.id + << "\n----payload----\nFilePath: " << responsePayload.filePath.c_str() + << "\nStart: " << responsePayload.start + << "\nEnd: " << responsePayload.end + << "\nPayload: " << responsePayload.payload.c_str() + << "\n---------------" << std::endl; + } } } else { std::wcout << "There are currently no packets to read!" << std::endl; diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 0166764..3c6d07e 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -15,7 +15,9 @@ void Worker::solveRequestCycle() { ServerSessionController::Packet request = getRequest(); if (std::holds_alternative(request.payload)) { - pushResponse(Worker::test(request)); + pushResponse(Worker::test(request)); + } else if (std::holds_alternative(request.payload)) { + pushResponse(Worker::setFile(request)); } else { std::wcout << "Unknown payload type!" << std::endl; } diff --git a/flake.lock b/flake.lock index 5c0f3c8..f9cd5ea 100644 --- a/flake.lock +++ b/flake.lock @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1778953537, - "narHash": "sha256-Q7Uv3SVxBqEXLOE57XLjm8VnnIq2pTH/3WhZcdtKd0Y=", + "lastModified": 1780428566, + "narHash": "sha256-FDwJzgO8vGXlMBPOwvj+iP8mJe4eTceY2r2Lg0IjDYw=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "2bf536ed952fdc54741153b895911ac7ecac9cd1", + "rev": "2792e261aba062a97b4302fdd40b9389575e5507", "type": "github" }, "original": { From 76b48d9d17bc170abcbeddca6d4c90c962c19b18 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Wed, 3 Jun 2026 08:14:38 +0200 Subject: [PATCH 40/64] update: ttp2 --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index f9cd5ea..6ca80f2 100644 --- a/flake.lock +++ b/flake.lock @@ -43,11 +43,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1780428566, - "narHash": "sha256-FDwJzgO8vGXlMBPOwvj+iP8mJe4eTceY2r2Lg0IjDYw=", + "lastModified": 1780467038, + "narHash": "sha256-vW1N8Em5fL/aKdaeInx/kLGcEHLoLGf0RQ/FZCidLts=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "2792e261aba062a97b4302fdd40b9389575e5507", + "rev": "a58a1a0d1520aba92b3e00da9812387ada01acfd", "type": "github" }, "original": { From 391325dd6ba3c42842517cfd770e0e03d286b5ee Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 15:27:49 +0200 Subject: [PATCH 41/64] update: add TUD to Tablo --- TabloMaster/CMakeLists.txt | 1 + TabloNode/CMakeLists.txt | 1 + flake.lock | 37 ++++++++++++++++++++++++++++++++++++- flake.nix | 8 ++++++++ 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/TabloMaster/CMakeLists.txt b/TabloMaster/CMakeLists.txt index cdcf74a..f2db8bc 100644 --- a/TabloMaster/CMakeLists.txt +++ b/TabloMaster/CMakeLists.txt @@ -12,5 +12,6 @@ add_executable(tablo-master ${SOURCES}) target_link_libraries(tablo-master PRIVATE tabcrypt) target_link_libraries(tablo-master PRIVATE tabnet) target_link_libraries(tablo-master PRIVATE ttp2) +target_link_libraries(tablo-master PRIVATE tud) install(TARGETS tablo-master DESTINATION bin) diff --git a/TabloNode/CMakeLists.txt b/TabloNode/CMakeLists.txt index 66cc93b..5dddf39 100644 --- a/TabloNode/CMakeLists.txt +++ b/TabloNode/CMakeLists.txt @@ -12,5 +12,6 @@ add_executable(tablo-node ${SOURCES}) target_link_libraries(tablo-node PRIVATE tabcrypt) target_link_libraries(tablo-node PRIVATE tabnet) target_link_libraries(tablo-node PRIVATE ttp2) +target_link_libraries(tablo-node PRIVATE tud) install(TARGETS tablo-node DESTINATION bin) diff --git a/flake.lock b/flake.lock index f9cd5ea..6392317 100644 --- a/flake.lock +++ b/flake.lock @@ -32,10 +32,27 @@ "type": "github" } }, + "nixpkgs_3": { + "locked": { + "lastModified": 1780243769, + "narHash": "sha256-x5UQuRsH3MqI0U9afaXSNqzTPSeZlRLvFAav2Ux1pNw=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "331800de5053fcebacf6813adb5db9c9dca22a0c", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "nixpkgs": "nixpkgs", - "ttp2": "ttp2" + "ttp2": "ttp2", + "tud": "tud" } }, "ttp2": { @@ -55,6 +72,24 @@ "repo": "ttp2", "type": "github" } + }, + "tud": { + "inputs": { + "nixpkgs": "nixpkgs_3" + }, + "locked": { + "lastModified": 1780664888, + "narHash": "sha256-2btGu6C1k9oGl2wNYcdqRfYHSRE34y8z/+kY8TuY0ZY=", + "owner": "Sobottasgithub", + "repo": "tud", + "rev": "24ba77d3476e9904cca2aebf5eed1190fb8b1aed", + "type": "github" + }, + "original": { + "owner": "Sobottasgithub", + "repo": "tud", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 6812b53..f37abbd 100644 --- a/flake.nix +++ b/flake.nix @@ -7,6 +7,10 @@ ttp2 = { url = "github:Sobottasgithub/ttp2"; }; + + tud = { + url = "github:Sobottasgithub/tud"; + }; }; outputs = @@ -14,6 +18,7 @@ self, nixpkgs, ttp2, + tud, }: let system = "x86_64-linux"; @@ -25,6 +30,7 @@ version = "1.3"; libttp2 = ttp2.packages.${system}.lib; + libtud = tud.packages.${system}.lib; packages = with pkgs; [ cmake @@ -32,6 +38,7 @@ gnumake protobuf libttp2 + libtud ]; in { @@ -191,6 +198,7 @@ libtabcrypt libtabnet libttp2 + libtud ; default = tablo; From bd40e728be613369efd1767ea14fd6400979d208 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 16:23:54 +0200 Subject: [PATCH 42/64] update: implement tud --- TabloMaster/src/utils/network_manager.cpp | 16 ++++++++++------ TabloMaster/src/utils/network_manager.h | 9 ++++----- TabloNode/src/utils/network_manager.cpp | 12 ++++++------ flake.lock | 6 +++--- 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 6d27552..c77e5fb 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -1,9 +1,8 @@ #include "network_manager.h" -#include "udp_discovery.h" - #include #include +#include #include #include @@ -16,8 +15,12 @@ NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start socket..." << std::endl; - std::thread udpDiscoveryThread(&UdpDiscovery::udpDiscoveryCycle, &udpDiscovery, interface); - + auto serverDiscovery = std::make_shared(interface, 4000, 4001, "Tablo"); + std::thread serverDiscoveryThread([serverDiscovery]() { + serverDiscovery->discoveryCycle(); + }); + this->udpDiscovery = std::move(serverDiscovery); + ServerSessionController tempServerSessionController; std::string containerIP = tempServerSessionController.getLocalIpAddress(interface); @@ -78,7 +81,8 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) while(serverSessionController->isConnected()) { // Establish new node connections - std::vector discoveredNodes = udpDiscovery.getNodeAdresses(); + // std::vector discoveredNodes = udpDiscovery->getDiscoveredAdresses(); + std::vector discoveredNodes; for (int newNodeIndex = 0; newNodeIndex < discoveredNodes.size(); newNodeIndex++) { bool isNew = true; @@ -157,5 +161,5 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) std::wcout << "Terminated!" << std::endl; networkingSession.detach(); - udpDiscoveryThread.join(); + serverDiscoveryThread.join(); } diff --git a/TabloMaster/src/utils/network_manager.h b/TabloMaster/src/utils/network_manager.h index 867aa2f..4140987 100644 --- a/TabloMaster/src/utils/network_manager.h +++ b/TabloMaster/src/utils/network_manager.h @@ -5,8 +5,7 @@ #include #include #include - -#include "udp_discovery.h" +#include class NetworkManager { @@ -19,9 +18,9 @@ class NetworkManager std::string ip; std::shared_ptr node; }; - - UdpDiscovery udpDiscovery; - std::thread udpDiscoveryThread; + + std::shared_ptr udpDiscovery; + std::thread serverDiscoveryThread; }; #endif diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp index 8cb210b..cf5b4d3 100644 --- a/TabloNode/src/utils/network_manager.cpp +++ b/TabloNode/src/utils/network_manager.cpp @@ -1,8 +1,8 @@ #include "network_manager.h" #include +#include -#include "udp_discovery.h" #include "worker.h" #include @@ -14,6 +14,7 @@ #include #include #include +#include NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start Socket...." << std::endl; @@ -21,7 +22,10 @@ NetworkManager::NetworkManager(std::string interface) { std::string containerIP = serverSessionController.getLocalIpAddress(interface); - udpThread = std::thread(&NetworkManager::handleUdpDiscovery, this, interface); + auto clientDiscovery = std::make_shared(interface, 4000, 4001, "Tablo"); + std::thread udpThread([clientDiscovery]() { + clientDiscovery->discoveryCycle(); + }); sockaddr_in serverAddress; serverAddress.sin_family = AF_INET; @@ -80,10 +84,6 @@ NetworkManager::NetworkManager(std::string interface) { } } -void NetworkManager::handleUdpDiscovery(std::string interface) { - UdpDiscovery udpDiscovery(interface); -} - void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { auto serverSessionController = std::make_shared(serverSocket, clientSocket); diff --git a/flake.lock b/flake.lock index d2e3dfd..aebe8ac 100644 --- a/flake.lock +++ b/flake.lock @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1780664888, - "narHash": "sha256-2btGu6C1k9oGl2wNYcdqRfYHSRE34y8z/+kY8TuY0ZY=", + "lastModified": 1780667474, + "narHash": "sha256-7kVDOah8KjJ6B/Mlh9GQRJmYZvBsojq0tV9mTaioFr0=", "owner": "Sobottasgithub", "repo": "tud", - "rev": "24ba77d3476e9904cca2aebf5eed1190fb8b1aed", + "rev": "4f50af8d19af0e493a253cad997272f5a5b95243", "type": "github" }, "original": { From 4e498f5af97c3ac9c5e4e5d88c5a15a2cd3873e3 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 16:34:46 +0200 Subject: [PATCH 43/64] update: remove old Udp Discovery --- TabloMaster/src/utils/udp_discovery.cpp | 180 ------------------------ TabloMaster/src/utils/udp_discovery.h | 25 ---- TabloNode/src/utils/udp_discovery.cpp | 107 -------------- TabloNode/src/utils/udp_discovery.h | 16 --- 4 files changed, 328 deletions(-) delete mode 100644 TabloMaster/src/utils/udp_discovery.cpp delete mode 100644 TabloMaster/src/utils/udp_discovery.h delete mode 100644 TabloNode/src/utils/udp_discovery.cpp delete mode 100644 TabloNode/src/utils/udp_discovery.h diff --git a/TabloMaster/src/utils/udp_discovery.cpp b/TabloMaster/src/utils/udp_discovery.cpp deleted file mode 100644 index ee48762..0000000 --- a/TabloMaster/src/utils/udp_discovery.cpp +++ /dev/null @@ -1,180 +0,0 @@ -#include "udp_discovery.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -void UdpDiscovery::udpDiscoveryCycle(std::string interface) { - std::wcout << "Start Udp discovery..." << std::endl; - - ServerSessionController serverSessionController; - std::string containerIP = serverSessionController.getLocalIpAddress(interface); - std::string broadcastIP = serverSessionController.getBroadcastIpAddress(); - - std::wcout << "Container IP: " << containerIP.c_str() << " | Broadcast IP: " << broadcastIP.c_str() << std::endl; - - if (containerIP.empty()) { - std::wcout << "Failed to find container IP!" << std::endl; - return; - } - - if (broadcastIP.empty()) { - std::wcout << "Failed to find broadcast IP!" << std::endl; - return; - } - - // Init: server socket - int serverSocket; - struct sockaddr_in broadcast{}, receiverAddress{}; - const int port = 4000; - - // Create socket - if ((serverSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - std::wcout << "Failed to create Socket!" << std::endl; - return; - } - // Enable broadcast - int broadcastBind = 1; - if (setsockopt(serverSocket, SOL_SOCKET, SO_BROADCAST, &broadcastBind, sizeof(broadcastBind)) < 0) { - std::wcout << "Failed to enable broadcast!" << std::endl; - close(serverSocket); - return; - } - // Allow reuse - int reuse = 1; - if (setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) { - std::wcout << "Setsockopt failed!" << std::endl; - close(serverSocket); - return; - } - - // clear garbage - memset(&broadcast, 0, sizeof(broadcast)); - // prepare socket - broadcast.sin_family = AF_INET; - broadcast.sin_port = htons(port); - - if (inet_pton(AF_INET, broadcastIP.c_str(), &broadcast.sin_addr) <= 0) { - std::wcout << "Invalid broadcast IP" << std::endl; - close(serverSocket); - return; - } - - // Init recieve socket - int tcpMasterSocket, tcpNodeSocket; - struct sockaddr_in tcpAddress; - int opt = 1; - socklen_t addrlen = sizeof(tcpAddress); - if ((tcpMasterSocket = socket(AF_INET, SOCK_STREAM, 0)) == 0) { - std::wcout << "socket failed" << std::endl; - return; - } - if (setsockopt(tcpMasterSocket, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) { - std::wcout << "Setsockopt failed!" << std::endl; - return; - } - tcpAddress.sin_family = AF_INET; - tcpAddress.sin_addr.s_addr = inet_addr(containerIP.c_str()); - tcpAddress.sin_port = htons(4001); - if (bind(tcpMasterSocket, (struct sockaddr*)&tcpAddress, sizeof(tcpAddress)) < 0) { - std::wcout << "Bind failed!" << std::endl; - return; - } - if (listen(tcpMasterSocket, 3) < 0) { - std::wcout << "Listen failed!" << std::endl; - return; - } - - while(true) { - // Send message - if (sendMessageTo(serverSocket, broadcast, containerIP.c_str()) != 0) { - std::wcout << "Broadcast failed!" << std::endl; - return; - } - - // Accept incoming connection - int flags = fcntl(tcpMasterSocket, F_GETFL, 0); - fcntl(tcpMasterSocket, F_SETFL, flags | O_NONBLOCK); - - int tcpNodeSocket = -1; - time_t start = time(nullptr); - while (time(nullptr) - start < 5) { - tcpNodeSocket = accept(tcpMasterSocket, (struct sockaddr*)&tcpAddress, (socklen_t*)&addrlen); - if (tcpNodeSocket >= 0) break; - usleep(100000); - } - - if (tcpNodeSocket < 0) { - // DEBUG ONLY: - //std::wcout << "Timeout: no connection" << std::endl; - continue; - } else { - std::string data = receiveMessage(tcpNodeSocket); - - // Add ip to discovered Ip's if not already in vector - if (serverSessionController.isValidIpV4(data) && std::find(nodeIPAddresses.begin(), nodeIPAddresses.end(), data) == nodeIPAddresses.end()) { - nodeIPAddresses.push_back(data); - } - - close(tcpNodeSocket); - } - usleep(100000); - } - close(serverSocket); - std::wcout << "UDP socket closed..." << std::endl; -} - -int UdpDiscovery::sendMessageTo(int socket, const sockaddr_in& broadcast, std::string payload) { - if (sendto(socket, payload.data(), payload.size(), 0, (struct sockaddr*)&broadcast, sizeof(broadcast)) < 0) { - std::wcout << "buffer: Sendto Failed!" << std::endl; - return -1; - } - - return 0; -} - -std::string UdpDiscovery::receiveMessage(int socket) { - std::string data; - pollfd pfd{}; - pfd.fd = socket; - pfd.events = POLLIN; - - int ret = poll(&pfd, 1, 10000); - - int bufferSize = 1024; - if (ret > 0 && (pfd.revents & POLLIN)) { - char* buffer = new char[bufferSize]; - ssize_t size = recv(socket, buffer, bufferSize, 0); - - data = buffer; - - if (size <= 0) return data; - return data; - } - return data; -} - -std::vector UdpDiscovery::getNodeAdresses() { - std::lock_guard lock(mtx); - return nodeIPAddresses; -} - -void UdpDiscovery::removeNodeAddress(std::string nodeAddress) { - std::lock_guard lock(mtx); - nodeIPAddresses.erase(find(nodeIPAddresses.begin(), nodeIPAddresses.end(), nodeAddress)); -} - diff --git a/TabloMaster/src/utils/udp_discovery.h b/TabloMaster/src/utils/udp_discovery.h deleted file mode 100644 index 190d982..0000000 --- a/TabloMaster/src/utils/udp_discovery.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef UDP_DISCOVERY_H -#define UDP_DISCOVERY_H - -#include -#include -#include -#include - -class UdpDiscovery -{ - public: - void udpDiscoveryCycle(std::string interface); - - std::vector getNodeAdresses(); - void removeNodeAddress(std::string nodeAddress); - - private: - std::vector nodeIPAddresses = {}; - std::mutex mtx; - - int sendMessageTo(int socket, const sockaddr_in& broadcast, std::string payload); - std::string receiveMessage(int socket); -}; - -#endif diff --git a/TabloNode/src/utils/udp_discovery.cpp b/TabloNode/src/utils/udp_discovery.cpp deleted file mode 100644 index b61e763..0000000 --- a/TabloNode/src/utils/udp_discovery.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "udp_discovery.h" - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -UdpDiscovery::UdpDiscovery(std::string interface) { - std::wcout << "Start udp discovery..." << std::endl; - - ServerSessionController serverSessionController; - std::string containerIP = serverSessionController.getLocalIpAddress(interface); - - int udpSocket; - const int port = 4000; - char buffer[1024]; - - udpSocket = socket(AF_INET, SOCK_DGRAM, 0); - if (udpSocket < 0) { - std::wcout << "Create socket failed!" << std::endl; - return; - } - - int broadcast = 1; - setsockopt(udpSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)); - - sockaddr_in nodeAddress{}; - nodeAddress.sin_family = AF_INET; - nodeAddress.sin_addr.s_addr = htonl(INADDR_ANY); - nodeAddress.sin_port = htons(port); - - if (bind(udpSocket, (struct sockaddr*)&nodeAddress, sizeof(nodeAddress)) < 0) { - std::wcout << "UDP Socket bind failed!" << std::endl; - return; - } - std::wcout << "Listening on UDP port " << port << std::endl; - while (true) { - // Get UDP Discovery packet - std::string masterIP = receiveMessage(udpSocket); - if (serverSessionController.isValidIpV4(masterIP)) { - // DEBUG ONLY: - //std::wcout << masterIP.c_str() << std::endl; - - // Send response over TCP - int recieveSocket = 0; - struct sockaddr_in masterAddress; - masterAddress.sin_family = AF_INET; - masterAddress.sin_port = htons(4001); - - if ((recieveSocket = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - std::wcout << "Socket creation error" << std::endl; - continue; - } - if (inet_pton(AF_INET, masterIP.c_str(), &masterAddress.sin_addr) <= 0) { - std::wcout << "Address not supported: " << masterIP.c_str() << std::endl; - continue; - } - if (connect(recieveSocket, (struct sockaddr*)&masterAddress, sizeof(masterAddress)) < 0) { - std::wcout << "Connection failed" << std::endl; - continue; - } - //send(recieveSocket, containerIP.c_str(), containerIP.size(), 0); - int result = sendMessage(recieveSocket, containerIP.c_str()); - close(recieveSocket); - } else { - std::wcout << "Invalid ip!" << std::endl; - } - } - close(udpSocket); -} - -std::string UdpDiscovery::receiveMessage(int socket) { - std::string data; - pollfd pfd{}; - pfd.fd = socket; - pfd.events = POLLIN; - - int ret = poll(&pfd, 1, 10000); - - int bufferSize = 1024; - if (ret > 0 && (pfd.revents & POLLIN)) { - char* buffer = new char[bufferSize]; - ssize_t size = recv(socket, buffer, bufferSize, 0); - data = buffer; - - if (size <= 0) return data; - return data; - } - return data; -} - -int UdpDiscovery::sendMessage(int socket, std::string payload) { - if (send(socket, payload.data(), payload.size(), 0) < 0) { - std::wcout << "buffer: Send Failed!" << std::endl; - return -1; - } - - return 0; -} - diff --git a/TabloNode/src/utils/udp_discovery.h b/TabloNode/src/utils/udp_discovery.h deleted file mode 100644 index 20d25e5..0000000 --- a/TabloNode/src/utils/udp_discovery.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef UDP_DISCOVERY_H -#define UDP_DISCOVERY_H - -#include - -class UdpDiscovery -{ - public: - UdpDiscovery(std::string interface); - - private: - std::string receiveMessage(int socket); - int sendMessage(int socket, std::string payload); -}; - -#endif From 381d25cba1e5910feee0107763158e9d930b55c2 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 18:16:56 +0200 Subject: [PATCH 44/64] update: fixup tud --- TabloMaster/src/utils/network_manager.cpp | 3 +-- flake.lock | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index c77e5fb..8669540 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -81,8 +81,7 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) while(serverSessionController->isConnected()) { // Establish new node connections - // std::vector discoveredNodes = udpDiscovery->getDiscoveredAdresses(); - std::vector discoveredNodes; + std::vector discoveredNodes = udpDiscovery->getDiscoveredAddresses(); for (int newNodeIndex = 0; newNodeIndex < discoveredNodes.size(); newNodeIndex++) { bool isNew = true; diff --git a/flake.lock b/flake.lock index aebe8ac..fe7c75d 100644 --- a/flake.lock +++ b/flake.lock @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1780667474, - "narHash": "sha256-7kVDOah8KjJ6B/Mlh9GQRJmYZvBsojq0tV9mTaioFr0=", + "lastModified": 1780675910, + "narHash": "sha256-8uz16UJtf6ZU3QhLHcnizGmdiB2AUcyDxrVD1Vv0Y3s=", "owner": "Sobottasgithub", "repo": "tud", - "rev": "4f50af8d19af0e493a253cad997272f5a5b95243", + "rev": "ae0960d439687a53f167bed67a7d95329281b90e", "type": "github" }, "original": { From 39c0bb7dc54e8d395cd9b70765a500b3f98a4950 Mon Sep 17 00:00:00 2001 From: Patrick Schulze <76741977+Sobottasgithub@users.noreply.github.com> Date: Fri, 5 Jun 2026 18:30:46 +0200 Subject: [PATCH 45/64] update: add supporting libs to readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 804c917..fc618c1 100644 --- a/README.md +++ b/README.md @@ -45,3 +45,7 @@ The flake in this repository allowes you to build minimal docker images that avo To use this feature, you NEED to use nix. Download available at: https://nixos.org/ +# Take a look at Tablos networking libs: +Tablo Transfer Protocol:TTP2 + +Tablo UDP Discovery: TUD From 556fc448c54d0d45870db4f6ac62409c7dfe3fef Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 19:38:08 +0200 Subject: [PATCH 46/64] update: use tud namespace --- TabloMaster/src/utils/network_manager.cpp | 2 +- TabloMaster/src/utils/network_manager.h | 2 +- TabloNode/src/utils/network_manager.cpp | 2 +- flake.lock | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 8669540..7a357fc 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -15,7 +15,7 @@ NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start socket..." << std::endl; - auto serverDiscovery = std::make_shared(interface, 4000, 4001, "Tablo"); + auto serverDiscovery = std::make_shared(interface, 4000, 4001, "Tablo"); std::thread serverDiscoveryThread([serverDiscovery]() { serverDiscovery->discoveryCycle(); }); diff --git a/TabloMaster/src/utils/network_manager.h b/TabloMaster/src/utils/network_manager.h index 4140987..12f306c 100644 --- a/TabloMaster/src/utils/network_manager.h +++ b/TabloMaster/src/utils/network_manager.h @@ -19,7 +19,7 @@ class NetworkManager std::shared_ptr node; }; - std::shared_ptr udpDiscovery; + std::shared_ptr udpDiscovery; std::thread serverDiscoveryThread; }; diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp index cf5b4d3..8595649 100644 --- a/TabloNode/src/utils/network_manager.cpp +++ b/TabloNode/src/utils/network_manager.cpp @@ -22,7 +22,7 @@ NetworkManager::NetworkManager(std::string interface) { std::string containerIP = serverSessionController.getLocalIpAddress(interface); - auto clientDiscovery = std::make_shared(interface, 4000, 4001, "Tablo"); + auto clientDiscovery = std::make_shared(interface, 4000, 4001, "Tablo"); std::thread udpThread([clientDiscovery]() { clientDiscovery->discoveryCycle(); }); diff --git a/flake.lock b/flake.lock index fe7c75d..5707ec3 100644 --- a/flake.lock +++ b/flake.lock @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1780675910, - "narHash": "sha256-8uz16UJtf6ZU3QhLHcnizGmdiB2AUcyDxrVD1Vv0Y3s=", + "lastModified": 1780680700, + "narHash": "sha256-xFcmuut7TaPkdkEd4o4wxe1OU6GGR7QSHnI5riDXhyw=", "owner": "Sobottasgithub", "repo": "tud", - "rev": "ae0960d439687a53f167bed67a7d95329281b90e", + "rev": "67b4603b87b4f8535046831dfeca5c3dbab4a031", "type": "github" }, "original": { From 387c4764684ea53a5a36223aaf4a4d4ded290bb6 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 20:28:14 +0200 Subject: [PATCH 47/64] update: ttp2 --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 5707ec3..893534d 100644 --- a/flake.lock +++ b/flake.lock @@ -78,11 +78,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1780680700, - "narHash": "sha256-xFcmuut7TaPkdkEd4o4wxe1OU6GGR7QSHnI5riDXhyw=", + "lastModified": 1780684021, + "narHash": "sha256-XucbF/32EUSvk8Of0ZIRc5cj/zDgoVwW57MK1z8ibmQ=", "owner": "Sobottasgithub", "repo": "tud", - "rev": "67b4603b87b4f8535046831dfeca5c3dbab4a031", + "rev": "640a87ee87f1c761b6be7451094e64c274c6900c", "type": "github" }, "original": { From 50f44ae9920ca8bdebd47aba5868f54b7eb9c5ba Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 5 Jun 2026 22:28:59 +0200 Subject: [PATCH 48/64] update: use namespace ttp2 --- TabloClient/src/utils/cli.cpp | 18 ++++++++-------- TabloClient/src/utils/network_manager.cpp | 6 +++--- TabloClient/src/utils/network_manager.h | 6 +++--- TabloMaster/src/utils/network_manager.cpp | 8 +++---- TabloMaster/src/utils/network_manager.h | 2 +- TabloNode/src/utils/network_manager.cpp | 4 ++-- TabloNode/src/utils/worker.cpp | 26 +++++++++++------------ TabloNode/src/utils/worker.h | 16 +++++++------- flake.lock | 6 +++--- 9 files changed, 46 insertions(+), 46 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 002cdbd..f7bc074 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -36,8 +36,8 @@ Cli::Cli(struct Argv argv) { } file.close(); - Networking::Packet packet; - Networking::File payload; + ttp2::Networking::Packet packet; + ttp2::Networking::File payload; payload.filePath = filePath; payload.start = 0; payload.end = lineCount; @@ -57,9 +57,9 @@ Cli::Cli(struct Argv argv) { std::wcout << "Content: "; std::cin >> content; - Networking::Packet packet; + ttp2::Networking::Packet packet; - Networking::Standard payload; + ttp2::Networking::Standard payload; payload.payload = content; packet.payload = payload; @@ -67,13 +67,13 @@ Cli::Cli(struct Argv argv) { } else if (option == "2") { if (networkManager.hasResponse()) { while (networkManager.hasResponse()) { - ClientSessionController::Packet response = networkManager.popResponse(); + ttp2::ClientSessionController::Packet response = networkManager.popResponse(); - if (std::holds_alternative(response.payload)) { - ClientSessionController::Standard responsePayload = std::get(response.payload); + if (std::holds_alternative(response.payload)) { + ttp2::ClientSessionController::Standard responsePayload = std::get(response.payload); std::wcout << "Response:\nID: " << response.id << "\nPayload: " << responsePayload.payload.c_str() << std::endl; - } else if (std::holds_alternative(response.payload)) { - ClientSessionController::File responsePayload = std::get(response.payload); + } else if (std::holds_alternative(response.payload)) { + ttp2::ClientSessionController::File responsePayload = std::get(response.payload); std::wcout << "Response:\nID: " << response.id << "\n----payload----\nFilePath: " << responsePayload.filePath.c_str() << "\nStart: " << responsePayload.start diff --git a/TabloClient/src/utils/network_manager.cpp b/TabloClient/src/utils/network_manager.cpp index 007c293..2d741b4 100644 --- a/TabloClient/src/utils/network_manager.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -27,7 +27,7 @@ int NetworkManager::createSocket(std::string tabloMaster) { return -1; } - clientSessionController = std::make_shared(serverSocket); + clientSessionController = std::make_shared(serverSocket); std::thread networkThread([this]() { clientSessionController->networkingSession(); @@ -41,10 +41,10 @@ bool NetworkManager::hasResponse() { return clientSessionController->hasResponse(); } -ClientSessionController::Packet NetworkManager::popResponse() { +ttp2::ClientSessionController::Packet NetworkManager::popResponse() { return clientSessionController->popResponse(); } -void NetworkManager::pushRequest(Networking::Packet packet) { +void NetworkManager::pushRequest(ttp2::Networking::Packet packet) { clientSessionController->pushRequest(packet); } diff --git a/TabloClient/src/utils/network_manager.h b/TabloClient/src/utils/network_manager.h index b0c02e4..dfec037 100644 --- a/TabloClient/src/utils/network_manager.h +++ b/TabloClient/src/utils/network_manager.h @@ -15,11 +15,11 @@ class NetworkManager int createSocket(std::string tabloMaster); bool hasResponse(); - ClientSessionController::Packet popResponse(); - void pushRequest(ClientSessionController::Packet packet); + ttp2::ClientSessionController::Packet popResponse(); + void pushRequest(ttp2::ClientSessionController::Packet packet); private: - std::shared_ptr clientSessionController; + std::shared_ptr clientSessionController; }; #endif diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 7a357fc..8f1fba5 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -21,7 +21,7 @@ NetworkManager::NetworkManager(std::string interface) { }); this->udpDiscovery = std::move(serverDiscovery); - ServerSessionController tempServerSessionController; + ttp2::ServerSessionController tempServerSessionController; std::string containerIP = tempServerSessionController.getLocalIpAddress(interface); sockaddr_in serverAddress; @@ -73,7 +73,7 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) std::wcout << "Handle client conn" << std::endl; std::vector nodeConnections; - auto serverSessionController = std::make_shared(serverSocket, clientSocket); + auto serverSessionController = std::make_shared(serverSocket, clientSocket); std::thread networkingSession([serverSessionController]() { serverSessionController->networkingSession(); @@ -110,7 +110,7 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) continue; } - std::shared_ptr clientSessionController = std::make_shared(nodeSocket); + std::shared_ptr clientSessionController = std::make_shared(nodeSocket); std::thread networkThread([clientSessionController]() { clientSessionController->networkingSession(); @@ -136,7 +136,7 @@ void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) // Send request if (serverSessionController->hasRequest()) { - ServerSessionController::Packet packet = serverSessionController->popRequest(); + ttp2::ServerSessionController::Packet packet = serverSessionController->popRequest(); std::wcout << "Received packet id: " << packet.id << std::endl; for (int index = 0; index < nodeConnections.size(); index++) { diff --git a/TabloMaster/src/utils/network_manager.h b/TabloMaster/src/utils/network_manager.h index 12f306c..9a2dfa2 100644 --- a/TabloMaster/src/utils/network_manager.h +++ b/TabloMaster/src/utils/network_manager.h @@ -16,7 +16,7 @@ class NetworkManager private: struct Nodes { std::string ip; - std::shared_ptr node; + std::shared_ptr node; }; std::shared_ptr udpDiscovery; diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp index 8595649..91c83aa 100644 --- a/TabloNode/src/utils/network_manager.cpp +++ b/TabloNode/src/utils/network_manager.cpp @@ -18,7 +18,7 @@ NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start Socket...." << std::endl; - ServerSessionController serverSessionController; + ttp2::ServerSessionController serverSessionController; std::string containerIP = serverSessionController.getLocalIpAddress(interface); @@ -85,7 +85,7 @@ NetworkManager::NetworkManager(std::string interface) { } void NetworkManager::handleClientConnection(int serverSocket, int clientSocket) { - auto serverSessionController = std::make_shared(serverSocket, clientSocket); + auto serverSessionController = std::make_shared(serverSocket, clientSocket); std::thread networkingSession([serverSessionController]() { serverSessionController->networkingSession(); diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 3c6d07e..4dbe035 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -12,11 +12,11 @@ void Worker::solveRequestCycle() { int requestSize = getRequestCollectionSize(); if (requestSize > 0) { for (int count = 0; count < requestSize; count++) { - ServerSessionController::Packet request = getRequest(); + ttp2::ServerSessionController::Packet request = getRequest(); - if (std::holds_alternative(request.payload)) { + if (std::holds_alternative(request.payload)) { pushResponse(Worker::test(request)); - } else if (std::holds_alternative(request.payload)) { + } else if (std::holds_alternative(request.payload)) { pushResponse(Worker::setFile(request)); } else { std::wcout << "Unknown payload type!" << std::endl; @@ -27,43 +27,43 @@ void Worker::solveRequestCycle() { } // Logic functions -ServerSessionController::Packet Worker::test(ServerSessionController::Packet packet) { +ttp2::ServerSessionController::Packet Worker::test(ttp2::ServerSessionController::Packet packet) { return packet; } -ServerSessionController::Packet Worker::setFile(ServerSessionController::Packet packet) { +ttp2::ServerSessionController::Packet Worker::setFile(ttp2::ServerSessionController::Packet packet) { return packet; } // Service logic -ServerSessionController::Packet Worker::getRequest() { +ttp2::ServerSessionController::Packet Worker::getRequest() { std::lock_guard lock(mtx); if (!requests.empty()) { - ServerSessionController::Packet firstRequest = requests[0]; + ttp2::ServerSessionController::Packet firstRequest = requests[0]; requests.erase(requests.begin()); return firstRequest; } - ServerSessionController::Packet emptyPacket; + ttp2::ServerSessionController::Packet emptyPacket; return emptyPacket; } -void Worker::pushRequest(ServerSessionController::Packet packet) { +void Worker::pushRequest(ttp2::ServerSessionController::Packet packet) { std::lock_guard lock(mtx); requests.push_back(packet); } -ServerSessionController::Packet Worker::getResponse() { +ttp2::ServerSessionController::Packet Worker::getResponse() { std::lock_guard lock(mtx); if (!responses.empty()) { - ServerSessionController::Packet firstResponse = responses[0]; + ttp2::ServerSessionController::Packet firstResponse = responses[0]; responses.erase(responses.begin()); return firstResponse; } - ServerSessionController::Packet emptyPacket; + ttp2::ServerSessionController::Packet emptyPacket; return emptyPacket; } -void Worker::pushResponse(ServerSessionController::Packet packet) { +void Worker::pushResponse(ttp2::ServerSessionController::Packet packet) { std::lock_guard lock(mtx); responses.push_back(packet); } diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index 94d18d9..464d5fa 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -13,23 +13,23 @@ class Worker void solveRequestCycle(); // Logic functions - ServerSessionController::Packet test(ServerSessionController::Packet packet); - ServerSessionController::Packet setFile(ServerSessionController::Packet packet); + ttp2::ServerSessionController::Packet test(ttp2::ServerSessionController::Packet packet); + ttp2::ServerSessionController::Packet setFile(ttp2::ServerSessionController::Packet packet); // Service logic - ServerSessionController::Packet getRequest(); - void pushRequest(ServerSessionController::Packet packet); + ttp2::ServerSessionController::Packet getRequest(); + void pushRequest(ttp2::ServerSessionController::Packet packet); - ServerSessionController::Packet getResponse(); - void pushResponse(ServerSessionController::Packet packet); + ttp2::ServerSessionController::Packet getResponse(); + void pushResponse(ttp2::ServerSessionController::Packet packet); int getResponseCollectionSize(); int getRequestCollectionSize(); private: std::mutex mtx; - std::vector responses; - std::vector requests; + std::vector responses; + std::vector requests; }; #endif diff --git a/flake.lock b/flake.lock index 893534d..5eef7f2 100644 --- a/flake.lock +++ b/flake.lock @@ -60,11 +60,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1780467038, - "narHash": "sha256-vW1N8Em5fL/aKdaeInx/kLGcEHLoLGf0RQ/FZCidLts=", + "lastModified": 1780690914, + "narHash": "sha256-QaZ/xWX1FivRMzxtXi8llmBGuxvnbZK2WZTYfn3T9so=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "a58a1a0d1520aba92b3e00da9812387ada01acfd", + "rev": "338a99dfba9bce3d704f5a04521269a791a4b291", "type": "github" }, "original": { From 8ea06fd29f7dcb44125b510da94fa3283fb0f056 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Fri, 5 Jun 2026 23:22:24 +0200 Subject: [PATCH 49/64] update: add sendFile to client cli --- TabloClient/src/utils/cli.cpp | 53 ++++++++++++++++++----------------- TabloClient/src/utils/cli.h | 4 +++ 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index f7bc074..6eff89b 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -22,31 +22,7 @@ Cli::Cli(struct Argv argv) { return; } - if (filePath.length() != 0) { - std::wcout << "FilePath: " << filePath.c_str() << std::endl; - std::ifstream file(filePath); - - if (file.is_open()) { - std::string fileContent; - std::string line; - int lineCount = 0; - while (std::getline(file, line)) { - lineCount++; - fileContent = fileContent + line.c_str() + "\n"; - } - file.close(); - - ttp2::Networking::Packet packet; - ttp2::Networking::File payload; - payload.filePath = filePath; - payload.start = 0; - payload.end = lineCount; - payload.payload = fileContent; - packet.payload = payload; - - networkManager.pushRequest(packet); - } - } + sendFile(filePath, &networkManager); while (true) { std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\noption:"; @@ -91,3 +67,30 @@ Cli::Cli(struct Argv argv) { } } +void Cli::sendFile(std::string filePath, NetworkManager* networkManager) { + if (filePath.length() != 0) { + std::wcout << "FilePath: " << filePath.c_str() << std::endl; + std::ifstream file(filePath); + + if (file.is_open()) { + std::string fileContent; + std::string line; + int lineCount = 0; + while (std::getline(file, line)) { + lineCount++; + fileContent = fileContent + line.c_str() + "\n"; + } + file.close(); + + ttp2::Networking::Packet packet; + ttp2::Networking::File payload; + payload.filePath = filePath; + payload.start = 0; + payload.end = lineCount; + payload.payload = fileContent; + packet.payload = payload; + + networkManager->pushRequest(packet); + } + } +} diff --git a/TabloClient/src/utils/cli.h b/TabloClient/src/utils/cli.h index 9057c03..812198f 100644 --- a/TabloClient/src/utils/cli.h +++ b/TabloClient/src/utils/cli.h @@ -1,6 +1,8 @@ #ifndef CLI_H #define CLI_H +#include "network_manager.h" + #include "argv_struct.h" class Cli @@ -8,6 +10,8 @@ class Cli public: Cli(struct Argv argv); + private: + void sendFile(std::string filePath, NetworkManager* networkManager); }; #endif From fb58777c593b252913595d814d0f8cc84a28f316 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Sat, 6 Jun 2026 00:01:38 +0200 Subject: [PATCH 50/64] update: add sendFile as option to use --- TabloClient/src/utils/cli.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 6eff89b..1db6433 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -25,7 +25,7 @@ Cli::Cli(struct Argv argv) { sendFile(filePath, &networkManager); while (true) { - std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\noption:"; + std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\n(3) send File\noption:"; std::string option = ""; std::cin >> option; if (option == "1") { @@ -61,6 +61,12 @@ Cli::Cli(struct Argv argv) { } else { std::wcout << "There are currently no packets to read!" << std::endl; } + } else if (option == "3") { + std::string filePath; + std::wcout << "CSV Filepath:"; + std::cin >> filePath; + + sendFile(filePath, &networkManager); } else { std::wcout << "invalid" << std::endl; } @@ -69,7 +75,6 @@ Cli::Cli(struct Argv argv) { void Cli::sendFile(std::string filePath, NetworkManager* networkManager) { if (filePath.length() != 0) { - std::wcout << "FilePath: " << filePath.c_str() << std::endl; std::ifstream file(filePath); if (file.is_open()) { @@ -91,6 +96,7 @@ void Cli::sendFile(std::string filePath, NetworkManager* networkManager) { packet.payload = payload; networkManager->pushRequest(packet); + std::wcout << "Send file with FilePath: " << filePath.c_str() << std::endl; } } } From 94a392b6c3c71488234c689d3ae1dd530b781580 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Sun, 7 Jun 2026 14:46:27 +0200 Subject: [PATCH 51/64] update: implement set File --- TabloNode/src/utils/worker.cpp | 9 ++++++--- TabloNode/src/utils/worker.h | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 4dbe035..af40616 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -5,6 +5,7 @@ #include #include #include +#include // Cycle void Worker::solveRequestCycle() { @@ -17,7 +18,8 @@ void Worker::solveRequestCycle() { if (std::holds_alternative(request.payload)) { pushResponse(Worker::test(request)); } else if (std::holds_alternative(request.payload)) { - pushResponse(Worker::setFile(request)); + ttp2::ServerSessionController::File file = std::get(request.payload); + Worker::setFile(file); } else { std::wcout << "Unknown payload type!" << std::endl; } @@ -31,8 +33,9 @@ ttp2::ServerSessionController::Packet Worker::test(ttp2::ServerSessionController return packet; } -ttp2::ServerSessionController::Packet Worker::setFile(ttp2::ServerSessionController::Packet packet) { - return packet; +void Worker::setFile(ttp2::ServerSessionController::File newFile) { + file = newFile; + std::wcout << file.payload.c_str() << std::endl; } // Service logic diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index 464d5fa..e448d74 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -14,7 +14,7 @@ class Worker // Logic functions ttp2::ServerSessionController::Packet test(ttp2::ServerSessionController::Packet packet); - ttp2::ServerSessionController::Packet setFile(ttp2::ServerSessionController::Packet packet); + void setFile(ttp2::ServerSessionController::File newFile); // Service logic ttp2::ServerSessionController::Packet getRequest(); @@ -30,6 +30,8 @@ class Worker std::mutex mtx; std::vector responses; std::vector requests; + + ttp2::ServerSessionController::File file; }; #endif From 912a72091d5563264f35b815643aedd809f2a922 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Sun, 7 Jun 2026 15:44:59 +0200 Subject: [PATCH 52/64] update: add viewport to cli --- TabloClient/src/utils/cli.cpp | 27 ++++++++++++++++++++++++++- flake.lock | 6 +++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 1db6433..afde8ea 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -25,7 +25,7 @@ Cli::Cli(struct Argv argv) { sendFile(filePath, &networkManager); while (true) { - std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\n(3) send File\noption:"; + std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\n(3) send File\n(4)Get Viewport\noption:"; std::string option = ""; std::cin >> option; if (option == "1") { @@ -67,6 +67,31 @@ Cli::Cli(struct Argv argv) { std::cin >> filePath; sendFile(filePath, &networkManager); + } else if (option == "4") { + int xStart; + int xEnd; + int yStart; + int yEnd; + + std::wcout << "xStart:"; + std::cin >> xStart; + std::wcout << "xEnd:"; + std::cin >> xEnd; + std::wcout << "yStart:"; + std::cin >> yStart; + std::wcout << "yEnd:"; + std::cin >> yEnd; + + ttp2::Networking::Packet packet; + ttp2::Networking::Viewport payload; + payload.xStart = xStart; + payload.xEnd = xEnd; + payload.yStart = yStart; + payload.yEnd = yEnd; + packet.payload = payload; + + networkManager.pushRequest(packet); + std::wcout << "Send Viewport request!" << std::endl; } else { std::wcout << "invalid" << std::endl; } diff --git a/flake.lock b/flake.lock index 5eef7f2..747ca72 100644 --- a/flake.lock +++ b/flake.lock @@ -60,11 +60,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1780690914, - "narHash": "sha256-QaZ/xWX1FivRMzxtXi8llmBGuxvnbZK2WZTYfn3T9so=", + "lastModified": 1780838919, + "narHash": "sha256-XKRQ7ClJNR1nAudc82aI2R8vQ0EZQ76hriTt9271DSQ=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "338a99dfba9bce3d704f5a04521269a791a4b291", + "rev": "e776328d3388213e44015239869b50794c79f246", "type": "github" }, "original": { From 1f098b4039e774c1ef5f9ce02171a83f9995b28a Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Sun, 7 Jun 2026 16:04:19 +0200 Subject: [PATCH 53/64] update: implement viewport --- TabloClient/src/utils/cli.cpp | 3 +++ TabloNode/src/utils/worker.cpp | 14 ++++++++++++++ TabloNode/src/utils/worker.h | 9 +++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index afde8ea..8da6b26 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -56,6 +56,9 @@ Cli::Cli(struct Argv argv) { << "\nEnd: " << responsePayload.end << "\nPayload: " << responsePayload.payload.c_str() << "\n---------------" << std::endl; + } else if (std::holds_alternative(response.payload)) { + ttp2::ClientSessionController::Viewport responseViewport = std::get(response.payload); + std::wcout << "Viewport: " << responseViewport.payload.c_str() << std::endl; } } } else { diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index af40616..e94d742 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -20,6 +20,9 @@ void Worker::solveRequestCycle() { } else if (std::holds_alternative(request.payload)) { ttp2::ServerSessionController::File file = std::get(request.payload); Worker::setFile(file); + } else if (std::holds_alternative(request.payload)) { + ttp2::ServerSessionController::Viewport viewportRequest = std::get(request.payload); + pushResponse(Worker::getViewport(viewportRequest)); } else { std::wcout << "Unknown payload type!" << std::endl; } @@ -38,6 +41,17 @@ void Worker::setFile(ttp2::ServerSessionController::File newFile) { std::wcout << file.payload.c_str() << std::endl; } +ttp2::ServerSessionController::Packet Worker::getViewport(ttp2::ServerSessionController::Viewport viewportRequest) { + std::wcout << viewportRequest.xStart << viewportRequest.xEnd << viewportRequest.yStart << viewportRequest.yEnd << std::endl; + + viewportRequest.payload = "Viewport response from Worker!"; + + ttp2::ServerSessionController::Packet packet; + packet.payload = viewportRequest; + return packet; +} + + // Service logic ttp2::ServerSessionController::Packet Worker::getRequest() { std::lock_guard lock(mtx); diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index e448d74..d23879f 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -12,10 +12,6 @@ class Worker // Cycle void solveRequestCycle(); - // Logic functions - ttp2::ServerSessionController::Packet test(ttp2::ServerSessionController::Packet packet); - void setFile(ttp2::ServerSessionController::File newFile); - // Service logic ttp2::ServerSessionController::Packet getRequest(); void pushRequest(ttp2::ServerSessionController::Packet packet); @@ -32,6 +28,11 @@ class Worker std::vector requests; ttp2::ServerSessionController::File file; + + // Logic functions + ttp2::ServerSessionController::Packet test(ttp2::ServerSessionController::Packet packet); + void setFile(ttp2::ServerSessionController::File newFile); + ttp2::ServerSessionController::Packet getViewport(ttp2::ServerSessionController::Viewport viewportRequest); }; #endif From c7e96b4f71b5c608d42b61e0741babfca6f9a0ec Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Sun, 7 Jun 2026 20:35:15 +0200 Subject: [PATCH 54/64] update: flake ttp2 --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 747ca72..6481b5e 100644 --- a/flake.lock +++ b/flake.lock @@ -60,11 +60,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1780838919, - "narHash": "sha256-XKRQ7ClJNR1nAudc82aI2R8vQ0EZQ76hriTt9271DSQ=", + "lastModified": 1780841606, + "narHash": "sha256-Y4r+imVUUwv9W4Q0Mf1mD1o0FXt/8gn/a/PqUf+dY7o=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "e776328d3388213e44015239869b50794c79f246", + "rev": "0b8cb05399fa95d46e4b5de5222982f6d1c97def", "type": "github" }, "original": { From 1bcfbe0821a5edd558c76a90b7f9212dfb78b7c7 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 8 Jun 2026 18:41:20 +0200 Subject: [PATCH 55/64] update: add csv_manager --- TabloNode/src/utils/csv_manager.cpp | 11 +++++++++++ TabloNode/src/utils/csv_manager.h | 18 ++++++++++++++++++ TabloNode/src/utils/worker.cpp | 6 ++++-- TabloNode/src/utils/worker.h | 3 ++- 4 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 TabloNode/src/utils/csv_manager.cpp create mode 100644 TabloNode/src/utils/csv_manager.h diff --git a/TabloNode/src/utils/csv_manager.cpp b/TabloNode/src/utils/csv_manager.cpp new file mode 100644 index 0000000..8eccd3a --- /dev/null +++ b/TabloNode/src/utils/csv_manager.cpp @@ -0,0 +1,11 @@ +#include "csv_manager.h" + +#include + +void CsvManager::setFile(ttp2::ServerSessionController::File newFile) { + this->file = newFile; +} + +std::string CsvManager::getFilePath() { + return this->file.filePath; +} diff --git a/TabloNode/src/utils/csv_manager.h b/TabloNode/src/utils/csv_manager.h new file mode 100644 index 0000000..02a60ce --- /dev/null +++ b/TabloNode/src/utils/csv_manager.h @@ -0,0 +1,18 @@ +#ifndef CSV_MANAGER_H +#define CSV_MANAGER_H + +#include + +#include + +class CsvManager { + public: + void setFile(ttp2::ServerSessionController::File newFile); + std::string getFilePath(); + + private: + ttp2::ServerSessionController::File file; + +}; + +#endif diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index e94d742..9f0acd7 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -1,6 +1,7 @@ #include "worker.h" #include +#include "csv_manager.h" #include #include @@ -37,8 +38,9 @@ ttp2::ServerSessionController::Packet Worker::test(ttp2::ServerSessionController } void Worker::setFile(ttp2::ServerSessionController::File newFile) { - file = newFile; - std::wcout << file.payload.c_str() << std::endl; + CsvManager newCsvManager; + newCsvManager.setFile(newFile); + this->csvManager = newCsvManager; } ttp2::ServerSessionController::Packet Worker::getViewport(ttp2::ServerSessionController::Viewport viewportRequest) { diff --git a/TabloNode/src/utils/worker.h b/TabloNode/src/utils/worker.h index d23879f..36a481c 100644 --- a/TabloNode/src/utils/worker.h +++ b/TabloNode/src/utils/worker.h @@ -2,6 +2,7 @@ #define WORKER_H #include +#include "csv_manager.h" #include #include @@ -27,7 +28,7 @@ class Worker std::vector responses; std::vector requests; - ttp2::ServerSessionController::File file; + CsvManager csvManager; // Logic functions ttp2::ServerSessionController::Packet test(ttp2::ServerSessionController::Packet packet); From 2f1a64a67c4f51083a73d786ca23de966dcfb34d Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Mon, 8 Jun 2026 18:43:22 +0200 Subject: [PATCH 56/64] update: fix typo in cli --- TabloClient/src/utils/cli.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index 8da6b26..e11a60f 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -25,7 +25,7 @@ Cli::Cli(struct Argv argv) { sendFile(filePath, &networkManager); while (true) { - std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\n(3) send File\n(4)Get Viewport\noption:"; + std::wcout << "Choose option\n(1) send Packet\n(2) read Packets\n(3) send File\n(4) get Viewport\noption:"; std::string option = ""; std::cin >> option; if (option == "1") { From f958977b2168f80a94bc2e39e38be2027fc8e2c5 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Tue, 9 Jun 2026 16:59:43 +0200 Subject: [PATCH 57/64] update: add rowCount and columnCount --- TabloNode/src/utils/csv_manager.cpp | 34 +++++++++++++++++++++++++++++ TabloNode/src/utils/csv_manager.h | 2 ++ 2 files changed, 36 insertions(+) diff --git a/TabloNode/src/utils/csv_manager.cpp b/TabloNode/src/utils/csv_manager.cpp index 8eccd3a..4658f67 100644 --- a/TabloNode/src/utils/csv_manager.cpp +++ b/TabloNode/src/utils/csv_manager.cpp @@ -2,10 +2,44 @@ #include +#include +#include +#include +#include + void CsvManager::setFile(ttp2::ServerSessionController::File newFile) { this->file = newFile; + std::wcout << this->file.payload.c_str() << std::endl; + std::wcout << "C: " << getColumnCount() << std::endl; + std::wcout << "R: " << getRowCount() << std::endl; } std::string CsvManager::getFilePath() { return this->file.filePath; } + +int CsvManager::getRowCount() { + int count = 0; + for (int index = 0; index < this->file.payload.length(); index++) + if (this->file.payload[index] == '\n') + count++; + return count; +} + +int CsvManager::getColumnCount() { + // get position of first linebreak + std::string delimiter = "\n"; + const std::boyer_moore_searcher searcher(delimiter.begin(), delimiter.end()); + const auto distanceToDelimiter = std::search(this->file.payload.begin(), this->file.payload.end(), searcher); + if (distanceToDelimiter != this->file.payload.end()) { + // substring first row + std::string firstRow = this->file.payload.substr(0, std::distance(this->file.payload.begin(), distanceToDelimiter)); + + int count = 1; + for (int index = 0; index < firstRow.length(); index++) + if (firstRow[index] == ',') + count++; + return count; + } else + return 0; +} diff --git a/TabloNode/src/utils/csv_manager.h b/TabloNode/src/utils/csv_manager.h index 02a60ce..5b6b50c 100644 --- a/TabloNode/src/utils/csv_manager.h +++ b/TabloNode/src/utils/csv_manager.h @@ -9,6 +9,8 @@ class CsvManager { public: void setFile(ttp2::ServerSessionController::File newFile); std::string getFilePath(); + int getRowCount(); + int getColumnCount(); private: ttp2::ServerSessionController::File file; From 8bad31ae852eca2e28e17bd25ba1127930acb1c0 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Tue, 9 Jun 2026 18:26:14 +0200 Subject: [PATCH 58/64] update: add getRowByIndex --- TabloNode/src/utils/csv_manager.cpp | 33 +++++++++++++++++++++++++++++ TabloNode/src/utils/csv_manager.h | 1 + 2 files changed, 34 insertions(+) diff --git a/TabloNode/src/utils/csv_manager.cpp b/TabloNode/src/utils/csv_manager.cpp index 4658f67..bf654f3 100644 --- a/TabloNode/src/utils/csv_manager.cpp +++ b/TabloNode/src/utils/csv_manager.cpp @@ -12,6 +12,8 @@ void CsvManager::setFile(ttp2::ServerSessionController::File newFile) { std::wcout << this->file.payload.c_str() << std::endl; std::wcout << "C: " << getColumnCount() << std::endl; std::wcout << "R: " << getRowCount() << std::endl; + std::wcout << "FirstRow: " << getRowByIndex(1).c_str() << std::endl; + std::wcout << "SecondRow: " << getRowByIndex(2).c_str() << std::endl; } std::string CsvManager::getFilePath() { @@ -43,3 +45,34 @@ int CsvManager::getColumnCount() { } else return 0; } + +std::string CsvManager::getRowByIndex(int index) { + std::string resultRow = ""; + + if (index < 1) { + return resultRow; + } else if (index <= getRowCount()) { + int count = 0; + if (index == 1) { + for (int countIndex = 0; countIndex < this->file.payload.length(); countIndex++) { + if (this->file.payload[countIndex] == '\n') + return resultRow; + resultRow = resultRow + this->file.payload[countIndex]; + } + } + + for (int countIndex = 0; countIndex < this->file.payload.length(); countIndex++) { + if (this->file.payload[countIndex] == '\n') { + if (count < index) + count++; + if (count == index) + break; + } else if (count == index-1) { + resultRow = resultRow + this->file.payload[countIndex]; + } + } + return resultRow; + } else { + return resultRow; + } +} diff --git a/TabloNode/src/utils/csv_manager.h b/TabloNode/src/utils/csv_manager.h index 5b6b50c..69958a7 100644 --- a/TabloNode/src/utils/csv_manager.h +++ b/TabloNode/src/utils/csv_manager.h @@ -11,6 +11,7 @@ class CsvManager { std::string getFilePath(); int getRowCount(); int getColumnCount(); + std::string getRowByIndex(int index); private: ttp2::ServerSessionController::File file; From 5d480393bdf2c1dcd8f038701c9048e92137c3ee Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Wed, 10 Jun 2026 12:17:47 +0200 Subject: [PATCH 59/64] update: add getColumnByIndex --- TabloNode/src/utils/csv_manager.cpp | 22 +++++++++++++++++++++- TabloNode/src/utils/csv_manager.h | 2 +- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/TabloNode/src/utils/csv_manager.cpp b/TabloNode/src/utils/csv_manager.cpp index bf654f3..9018995 100644 --- a/TabloNode/src/utils/csv_manager.cpp +++ b/TabloNode/src/utils/csv_manager.cpp @@ -12,8 +12,8 @@ void CsvManager::setFile(ttp2::ServerSessionController::File newFile) { std::wcout << this->file.payload.c_str() << std::endl; std::wcout << "C: " << getColumnCount() << std::endl; std::wcout << "R: " << getRowCount() << std::endl; - std::wcout << "FirstRow: " << getRowByIndex(1).c_str() << std::endl; std::wcout << "SecondRow: " << getRowByIndex(2).c_str() << std::endl; + std::wcout << "SecondColumn: " << getColumnByIndex(2).c_str() << std::endl; } std::string CsvManager::getFilePath() { @@ -76,3 +76,23 @@ std::string CsvManager::getRowByIndex(int index) { return resultRow; } } + +std::string CsvManager::getColumnByIndex(int index) { + std::string resultRow; + + int column = 0; + for (int countIndex = 0; countIndex < this->file.payload.length(); countIndex++) { + if (this->file.payload[countIndex] == '\n') { + resultRow = resultRow + '\n'; + column = 0; + } else if (this->file.payload[countIndex] == ',') { + column++; + continue; + } + if (column == index-1) { + resultRow = resultRow + this->file.payload[countIndex]; + } + } + + return resultRow; +} diff --git a/TabloNode/src/utils/csv_manager.h b/TabloNode/src/utils/csv_manager.h index 69958a7..2041c11 100644 --- a/TabloNode/src/utils/csv_manager.h +++ b/TabloNode/src/utils/csv_manager.h @@ -12,10 +12,10 @@ class CsvManager { int getRowCount(); int getColumnCount(); std::string getRowByIndex(int index); + std::string getColumnByIndex(int index); private: ttp2::ServerSessionController::File file; - }; #endif From 4bfacd735d966fca3496d2339b23d8cbb9092b30 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Wed, 10 Jun 2026 12:26:31 +0200 Subject: [PATCH 60/64] update: fix get first column --- TabloNode/src/utils/csv_manager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/TabloNode/src/utils/csv_manager.cpp b/TabloNode/src/utils/csv_manager.cpp index 9018995..f529a09 100644 --- a/TabloNode/src/utils/csv_manager.cpp +++ b/TabloNode/src/utils/csv_manager.cpp @@ -13,7 +13,7 @@ void CsvManager::setFile(ttp2::ServerSessionController::File newFile) { std::wcout << "C: " << getColumnCount() << std::endl; std::wcout << "R: " << getRowCount() << std::endl; std::wcout << "SecondRow: " << getRowByIndex(2).c_str() << std::endl; - std::wcout << "SecondColumn: " << getColumnByIndex(2).c_str() << std::endl; + std::wcout << "SecondColumn: " << getColumnByIndex(1).c_str() << std::endl; } std::string CsvManager::getFilePath() { @@ -85,6 +85,7 @@ std::string CsvManager::getColumnByIndex(int index) { if (this->file.payload[countIndex] == '\n') { resultRow = resultRow + '\n'; column = 0; + continue; } else if (this->file.payload[countIndex] == ',') { column++; continue; From 0dd6fd4f06524e8cce9520e9f4b1a45d7112670c Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Wed, 10 Jun 2026 16:45:47 +0200 Subject: [PATCH 61/64] update: implement Viewport --- TabloClient/src/utils/cli.cpp | 6 ++++- TabloNode/src/utils/csv_manager.cpp | 35 +++++++++++++++++++++-------- TabloNode/src/utils/csv_manager.h | 2 ++ TabloNode/src/utils/worker.cpp | 14 +++++++----- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index e11a60f..ee13fc7 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -58,7 +58,11 @@ Cli::Cli(struct Argv argv) { << "\n---------------" << std::endl; } else if (std::holds_alternative(response.payload)) { ttp2::ClientSessionController::Viewport responseViewport = std::get(response.payload); - std::wcout << "Viewport: " << responseViewport.payload.c_str() << std::endl; + if (responseViewport.payload.length() > 0) { + std::wcout << responseViewport.payload.c_str() << std::endl; + } else { + std::wcout << "Empty Viewpor" << std::endl; + } } } } else { diff --git a/TabloNode/src/utils/csv_manager.cpp b/TabloNode/src/utils/csv_manager.cpp index f529a09..9929fbf 100644 --- a/TabloNode/src/utils/csv_manager.cpp +++ b/TabloNode/src/utils/csv_manager.cpp @@ -9,11 +9,6 @@ void CsvManager::setFile(ttp2::ServerSessionController::File newFile) { this->file = newFile; - std::wcout << this->file.payload.c_str() << std::endl; - std::wcout << "C: " << getColumnCount() << std::endl; - std::wcout << "R: " << getRowCount() << std::endl; - std::wcout << "SecondRow: " << getRowByIndex(2).c_str() << std::endl; - std::wcout << "SecondColumn: " << getColumnByIndex(1).c_str() << std::endl; } std::string CsvManager::getFilePath() { @@ -78,22 +73,44 @@ std::string CsvManager::getRowByIndex(int index) { } std::string CsvManager::getColumnByIndex(int index) { + return getColumnByIndex(index, this->file.payload); +} + +std::string CsvManager::getColumnByIndex(int index, std::string rows) { std::string resultRow; int column = 0; - for (int countIndex = 0; countIndex < this->file.payload.length(); countIndex++) { - if (this->file.payload[countIndex] == '\n') { + for (int countIndex = 0; countIndex < rows.length(); countIndex++) { + if (rows[countIndex] == '\n') { resultRow = resultRow + '\n'; column = 0; continue; - } else if (this->file.payload[countIndex] == ',') { + } else if (rows[countIndex] == ',') { column++; continue; } if (column == index-1) { - resultRow = resultRow + this->file.payload[countIndex]; + resultRow = resultRow + rows[countIndex]; } } return resultRow; } + +std::string CsvManager::getViewport(int xStart, int xEnd, int yStart, int yEnd) { + std::string resultPayload = ""; + for (int xIndex = xStart; xIndex <= xEnd; xIndex++) { + std::string currentRow = getRowByIndex(xIndex); + + std::string resultRow = ""; + for (int yIndex = yStart; yIndex <= yEnd; yIndex++) { + resultRow = resultRow + getColumnByIndex(yIndex, currentRow); + if (yIndex != yEnd) { + resultRow = resultRow + ','; + } + } + + resultPayload = resultPayload + resultRow + '\n'; + } + return resultPayload; +} diff --git a/TabloNode/src/utils/csv_manager.h b/TabloNode/src/utils/csv_manager.h index 2041c11..6661c2f 100644 --- a/TabloNode/src/utils/csv_manager.h +++ b/TabloNode/src/utils/csv_manager.h @@ -13,6 +13,8 @@ class CsvManager { int getColumnCount(); std::string getRowByIndex(int index); std::string getColumnByIndex(int index); + std::string getColumnByIndex(int index, std::string rows); + std::string getViewport(int xStart, int xEnd, int yStart, int yEnd); private: ttp2::ServerSessionController::File file; diff --git a/TabloNode/src/utils/worker.cpp b/TabloNode/src/utils/worker.cpp index 9f0acd7..22462b9 100644 --- a/TabloNode/src/utils/worker.cpp +++ b/TabloNode/src/utils/worker.cpp @@ -44,16 +44,20 @@ void Worker::setFile(ttp2::ServerSessionController::File newFile) { } ttp2::ServerSessionController::Packet Worker::getViewport(ttp2::ServerSessionController::Viewport viewportRequest) { - std::wcout << viewportRequest.xStart << viewportRequest.xEnd << viewportRequest.yStart << viewportRequest.yEnd << std::endl; - - viewportRequest.payload = "Viewport response from Worker!"; - ttp2::ServerSessionController::Packet packet; + + if (viewportRequest.xEnd < viewportRequest.xStart || viewportRequest.yEnd < viewportRequest.yStart) { + ttp2::ServerSessionController::Viewport emptyViewport; + packet.payload = emptyViewport; + return packet; + } + + viewportRequest.payload = this->csvManager.getViewport(viewportRequest.xStart, viewportRequest.xEnd, + viewportRequest.yStart, viewportRequest.yEnd); packet.payload = viewportRequest; return packet; } - // Service logic ttp2::ServerSessionController::Packet Worker::getRequest() { std::lock_guard lock(mtx); From 28f7f353b37102fab7e65abf968a9afc7aeec827 Mon Sep 17 00:00:00 2001 From: Patrick Schulze Date: Thu, 11 Jun 2026 20:44:45 +0200 Subject: [PATCH 62/64] update: flake --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 6481b5e..9980120 100644 --- a/flake.lock +++ b/flake.lock @@ -60,11 +60,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1780841606, - "narHash": "sha256-Y4r+imVUUwv9W4Q0Mf1mD1o0FXt/8gn/a/PqUf+dY7o=", + "lastModified": 1781203339, + "narHash": "sha256-yHhgfQOWHhnn17yqZ57fi5glWG7BqOC2qdzt5z1AIW8=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "0b8cb05399fa95d46e4b5de5222982f6d1c97def", + "rev": "6c68f6ad6baa9bfc595efdfffef269b7f3f84da9", "type": "github" }, "original": { From 97e66674f634fdd9040d894e3ded9df6f0f4510b Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 12 Jun 2026 19:38:06 +0200 Subject: [PATCH 63/64] update: ttp2 --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index 9980120..ba113fc 100644 --- a/flake.lock +++ b/flake.lock @@ -60,11 +60,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1781203339, - "narHash": "sha256-yHhgfQOWHhnn17yqZ57fi5glWG7BqOC2qdzt5z1AIW8=", + "lastModified": 1781285548, + "narHash": "sha256-AWF1w1671jd/K4Pfi72NwkudRRkuoZJl1VuxzYYTQ4I=", "owner": "Sobottasgithub", "repo": "ttp2", - "rev": "6c68f6ad6baa9bfc595efdfffef269b7f3f84da9", + "rev": "5b6b6864d3fce60a47337956e2a7c61d2b98d704", "type": "github" }, "original": { From 57475d6518efa18648f644f55e7659d17f393a03 Mon Sep 17 00:00:00 2001 From: Sobottasgithub Date: Fri, 12 Jun 2026 20:07:49 +0200 Subject: [PATCH 64/64] update: fixup --- TabloClient/src/utils/cli.cpp | 2 +- TabloClient/src/utils/network_manager.cpp | 1 + TabloMaster/src/utils/network_manager.cpp | 3 ++- TabloNode/src/utils/network_manager.cpp | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/TabloClient/src/utils/cli.cpp b/TabloClient/src/utils/cli.cpp index ee13fc7..ad8fae3 100644 --- a/TabloClient/src/utils/cli.cpp +++ b/TabloClient/src/utils/cli.cpp @@ -61,7 +61,7 @@ Cli::Cli(struct Argv argv) { if (responseViewport.payload.length() > 0) { std::wcout << responseViewport.payload.c_str() << std::endl; } else { - std::wcout << "Empty Viewpor" << std::endl; + std::wcout << "Empty Viewport" << std::endl; } } } diff --git a/TabloClient/src/utils/network_manager.cpp b/TabloClient/src/utils/network_manager.cpp index 2d741b4..0b96e43 100644 --- a/TabloClient/src/utils/network_manager.cpp +++ b/TabloClient/src/utils/network_manager.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include NetworkManager::NetworkManager() {} diff --git a/TabloMaster/src/utils/network_manager.cpp b/TabloMaster/src/utils/network_manager.cpp index 8f1fba5..3bd6997 100644 --- a/TabloMaster/src/utils/network_manager.cpp +++ b/TabloMaster/src/utils/network_manager.cpp @@ -12,6 +12,7 @@ #include #include #include +#include NetworkManager::NetworkManager(std::string interface) { std::wcout << "Start socket..." << std::endl; @@ -42,7 +43,7 @@ NetworkManager::NetworkManager(std::string interface) { } // Set epoll action for server struct epoll_event serverEvents; - serverEvents.events = EPOLLIN | EPOLLOUT; + serverEvents.events = EPOLLIN; serverEvents.data.fd = serverSocket; if (epoll_ctl(epollFd, EPOLL_CTL_ADD, serverSocket, &serverEvents) == -1) { std::wcout << "Failed to set epoll_ctl!" << std::endl; diff --git a/TabloNode/src/utils/network_manager.cpp b/TabloNode/src/utils/network_manager.cpp index 91c83aa..a02d646 100644 --- a/TabloNode/src/utils/network_manager.cpp +++ b/TabloNode/src/utils/network_manager.cpp @@ -45,7 +45,7 @@ NetworkManager::NetworkManager(std::string interface) { } // Set epoll action for server struct epoll_event serverEvents; - serverEvents.events = EPOLLIN | EPOLLOUT; + serverEvents.events = EPOLLIN; serverEvents.data.fd = serverSocket; if (epoll_ctl(epollFd, EPOLL_CTL_ADD, serverSocket, &serverEvents) == -1) { std::wcout << "Failed to set epoll_ctl!" << std::endl;