diff --git a/tservice.cpp b/tservice.cpp index 0ece1fd..ecdbe7a 100644 --- a/tservice.cpp +++ b/tservice.cpp @@ -13,6 +13,11 @@ extern "C" { #include #include +TunNetwork::TunNetwork(std::string iladdr, std::string iraddr) { + laddr = iladdr; + raddr = iraddr; + used = false; +} TunService::TunService(int svcport, std::string itunnelnet, std::vector ilocalnets) { listenport = svcport; @@ -42,7 +47,9 @@ std::expected TunService::Init(void) { auto raddrRes = nethost(netaddr, prefix, i + 2); auto laddr = laddrRes.value(); auto raddr = raddrRes.value(); - uxlogger.Debug(std::format("Networks: {} {}", laddr, raddr)); + TunNetwork tunnet(laddr, raddr); + tunnets.push_back(tunnet); + uxlogger.Debug(std::format("Aviliable address: {} -- {}", laddr, raddr)); } return {}; } @@ -102,31 +109,17 @@ std::expected TunService::Listen(void) { void TunService::Handle(int sock) { - auto networkRes = network(tunnelnet); - if (!networkRes) { - uxlogger.Error(networkRes.error()); - return; - } - auto prefixRes = netprefix(tunnelnet); - if (!prefixRes) { - uxlogger.Error(prefixRes.error()); - return; - } - int num = (sock - 3); - auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num); - if (!networkRes) { - uxlogger.Error(networkRes.error()); - return; - } - auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), num + 1); - if (!remoteaddrRes) { - uxlogger.Error(remoteaddrRes.error()); - return; + std::string laddr, raddr; + for (auto& net: tunnets) { + if (!net.used) { + laddr = net.laddr; + raddr = net.raddr; + net.used = true; + break; + } } uxlogger.Debug("Start socker handler"); SocketHandler handler; - std::string laddr = localaddrRes.value(); - std::string raddr = remoteaddrRes.value(); handler.Handle(sock, laddr, raddr, localnets); uxlogger.Debug("Stop socket handler"); close(sock); diff --git a/tservice.hpp b/tservice.hpp index 7b6aff3..3918c95 100644 --- a/tservice.hpp +++ b/tservice.hpp @@ -8,15 +8,21 @@ #include -class NetworkSlot { +class TunNetwork { +public: + TunNetwork(std::string iladdr, std::string iraddr); + std::string laddr; + std::string raddr; + bool used; }; + class TunService { private: std::string tunnelnet; std::vector localnets; - std::vector netslots; + std::vector tunnets; int listenport; int sock; public: