diff --git a/interface.cpp b/interface.cpp index a461224..b71f532 100644 --- a/interface.cpp +++ b/interface.cpp @@ -284,6 +284,16 @@ std::expected Interface::Read() { return rdata; } +std::expected Interface::Write(std::string payload) { + int wsize = 0; + if ((wsize = write(tunfd, payload.data(), payload.size())) < 0) { + int errnocopy = errno; + std::string error = std::strerror(errnocopy); + return std::unexpected("Write interface error: " + error); + } + return wsize; +} + std::string Interface::Name() { return ifname; } diff --git a/interface.hpp b/interface.hpp index 9da2d3b..2a88e42 100644 --- a/interface.hpp +++ b/interface.hpp @@ -22,6 +22,7 @@ public: std::expected Down(void); std::expected Read(void); + std::expected Write(std::string payload); ~Interface(); }; diff --git a/sockhand.cpp b/sockhand.cpp index abc9509..e27f37a 100644 --- a/sockhand.cpp +++ b/sockhand.cpp @@ -19,12 +19,6 @@ extern "C" { #include - - - -using namespace std::chrono_literals; - - void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, int prefix) { sock = newsock; auto interfaceName = std::format("uxsrv{}", sock); @@ -49,8 +43,6 @@ void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, in uxlogger.Error(createRes.error()); return; } - - std::thread recvThr(&SocketHandler::RecvMessages, this); recvThr.detach(); @@ -148,7 +140,7 @@ void SocketHandler::RecvMessages(void) { break; } if (rsize < msgHeaderSize) { - uxlogger.Log(std::format("Read only {} from {} bytes", rsize, msgHeaderSize)); + uxlogger.Log(std::format("Read only {} from {} header bytes", rsize, msgHeaderSize)); break; } MessageHeader header; @@ -158,17 +150,34 @@ void SocketHandler::RecvMessages(void) { break; } auto pSize = header.PayloadSize(); - if (pSize > 0) { - std::string rawMessage(pSize, 0); - if ((rsize = recv(sock, rawMessage.data(), rawMessage.size(), MSG_WAITALL)) < 0) { - int errnoCopy = errno; - std::string error = std::strerror(errnoCopy); - uxlogger.Log(std::format("Read message error: {}", error)); - break; + if (pSize == 0) { + continue; + } + std::string rawMessage(pSize, 0); + if ((rsize = recv(sock, rawMessage.data(), rawMessage.size(), MSG_WAITALL)) < 0) { + int errnoCopy = errno; + std::string error = std::strerror(errnoCopy); + uxlogger.Log(std::format("Read message error: {}", error)); + break; + } + uxcontrol::SimpleMessage simpleMsg; + simpleMsg.ParseFromString(rawMessage); + + auto metaPart = simpleMsg.meta(); + auto kind = metaPart.kind(); + uxlogger.Debug(std::format("Received message kind of {}", kind)); + + if (kind == internetPkgMsg) { + uxcontrol::PacketMessage packetMessage; + packetMessage.ParseFromString(rawMessage); + auto payload = packetMessage.payload(); + auto writeRes = interface.Write(payload); + if (!writeRes) { + auto error = writeRes.error(); + uxlogger.Error(std::format("Write packet error: {}", error)); } - uxcontrol::SimpleMessage msg; - msg.ParseFromString(rawMessage); - uxlogger.Log(std::format("Receive message {}", msg.meta().kind())); + } else { + uxlogger.Warning("Received unknown kind of message"); } } done.release(); diff --git a/tservice.cpp b/tservice.cpp index 506d005..debbe93 100644 --- a/tservice.cpp +++ b/tservice.cpp @@ -85,12 +85,13 @@ void TunService::Handle(int sock) { uxlogger.Error(networkRes.error()); return; } - auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), sock); + int num = (sock - 2) * 2; + auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num); if (!networkRes) { uxlogger.Error(networkRes.error()); return; } - auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), sock + 1); + auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), num + 1); if (!remoteaddrRes) { uxlogger.Error(remoteaddrRes.error()); return; diff --git a/uxclient.cpp b/uxclient.cpp index 0e0c930..099c484 100644 --- a/uxclient.cpp +++ b/uxclient.cpp @@ -117,14 +117,13 @@ void UxClient::RecvMessages(void) { meta.ParseFromString(rawMessage); auto metaPart = meta.meta(); auto kind = metaPart.kind(); - uxlogger.Debug(std::format("Receive message with call {}", kind)); + uxlogger.Debug(std::format("Received message kind of {}", kind)); + if (kind == tunAddressMsg) { uxcontrol::AddressMessage addrMessage; addrMessage.ParseFromString(rawMessage); - uxlogger.Debug(std::format("Receive address {}", addrMessage.address())); uxlogger.Debug(std::format("Receive prefix {}", addrMessage.prefix())); - auto setAddrRes = interface.SetIP4Address(addrMessage.address()); if (!setAddrRes) { uxlogger.Error(setAddrRes.error()); @@ -133,6 +132,15 @@ void UxClient::RecvMessages(void) { if (!setMaskRes) { uxlogger.Error(setMaskRes.error()); } + } else if (kind == internetPkgMsg) { + uxcontrol::PacketMessage packetMessage; + packetMessage.ParseFromString(rawMessage); + auto payload = packetMessage.payload(); + auto writeRes = interface.Write(payload); + if (!writeRes) { + auto error = writeRes.error(); + uxlogger.Error(std::format("Write packet error: {}", error)); + } } else { uxlogger.Warning("Received unknown kind of message"); } @@ -143,8 +151,8 @@ void UxClient::RecvMessages(void) { void UxClient::SendMessages(void) { while (true) { - std::this_thread::sleep_for(std::chrono::seconds(10)); - continue; + //std::this_thread::sleep_for(std::chrono::seconds(10)); + //continue; auto readRes = interface.Read(); if (!readRes) {