working commit

This commit is contained in:
2026-05-17 12:41:25 +02:00
parent cfb8329741
commit f0aa8a7ff2
5 changed files with 55 additions and 26 deletions
+10
View File
@@ -284,6 +284,16 @@ std::expected<std::string, std::string> Interface::Read() {
return rdata; return rdata;
} }
std::expected<int, std::string> 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() { std::string Interface::Name() {
return ifname; return ifname;
} }
+1
View File
@@ -22,6 +22,7 @@ public:
std::expected<void, std::string> Down(void); std::expected<void, std::string> Down(void);
std::expected<std::string, std::string> Read(void); std::expected<std::string, std::string> Read(void);
std::expected<int, std::string> Write(std::string payload);
~Interface(); ~Interface();
}; };
+22 -13
View File
@@ -19,12 +19,6 @@ extern "C" {
#include <uxcontrol.pb.h> #include <uxcontrol.pb.h>
using namespace std::chrono_literals;
void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, int prefix) { void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, int prefix) {
sock = newsock; sock = newsock;
auto interfaceName = std::format("uxsrv{}", sock); 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()); uxlogger.Error(createRes.error());
return; return;
} }
std::thread recvThr(&SocketHandler::RecvMessages, this); std::thread recvThr(&SocketHandler::RecvMessages, this);
recvThr.detach(); recvThr.detach();
@@ -148,7 +140,7 @@ void SocketHandler::RecvMessages(void) {
break; break;
} }
if (rsize < msgHeaderSize) { 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; break;
} }
MessageHeader header; MessageHeader header;
@@ -158,7 +150,9 @@ void SocketHandler::RecvMessages(void) {
break; break;
} }
auto pSize = header.PayloadSize(); auto pSize = header.PayloadSize();
if (pSize > 0) { if (pSize == 0) {
continue;
}
std::string rawMessage(pSize, 0); std::string rawMessage(pSize, 0);
if ((rsize = recv(sock, rawMessage.data(), rawMessage.size(), MSG_WAITALL)) < 0) { if ((rsize = recv(sock, rawMessage.data(), rawMessage.size(), MSG_WAITALL)) < 0) {
int errnoCopy = errno; int errnoCopy = errno;
@@ -166,9 +160,24 @@ void SocketHandler::RecvMessages(void) {
uxlogger.Log(std::format("Read message error: {}", error)); uxlogger.Log(std::format("Read message error: {}", error));
break; break;
} }
uxcontrol::SimpleMessage msg; uxcontrol::SimpleMessage simpleMsg;
msg.ParseFromString(rawMessage); simpleMsg.ParseFromString(rawMessage);
uxlogger.Log(std::format("Receive message {}", msg.meta().kind()));
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));
}
} else {
uxlogger.Warning("Received unknown kind of message");
} }
} }
done.release(); done.release();
+3 -2
View File
@@ -85,12 +85,13 @@ void TunService::Handle(int sock) {
uxlogger.Error(networkRes.error()); uxlogger.Error(networkRes.error());
return; return;
} }
auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), sock); int num = (sock - 2) * 2;
auto localaddrRes = nethost(networkRes.value(), prefixRes.value(), num);
if (!networkRes) { if (!networkRes) {
uxlogger.Error(networkRes.error()); uxlogger.Error(networkRes.error());
return; return;
} }
auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), sock + 1); auto remoteaddrRes = nethost(networkRes.value(), prefixRes.value(), num + 1);
if (!remoteaddrRes) { if (!remoteaddrRes) {
uxlogger.Error(remoteaddrRes.error()); uxlogger.Error(remoteaddrRes.error());
return; return;
+13 -5
View File
@@ -117,14 +117,13 @@ void UxClient::RecvMessages(void) {
meta.ParseFromString(rawMessage); meta.ParseFromString(rawMessage);
auto metaPart = meta.meta(); auto metaPart = meta.meta();
auto kind = metaPart.kind(); 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) { if (kind == tunAddressMsg) {
uxcontrol::AddressMessage addrMessage; uxcontrol::AddressMessage addrMessage;
addrMessage.ParseFromString(rawMessage); addrMessage.ParseFromString(rawMessage);
uxlogger.Debug(std::format("Receive address {}", addrMessage.address())); uxlogger.Debug(std::format("Receive address {}", addrMessage.address()));
uxlogger.Debug(std::format("Receive prefix {}", addrMessage.prefix())); uxlogger.Debug(std::format("Receive prefix {}", addrMessage.prefix()));
auto setAddrRes = interface.SetIP4Address(addrMessage.address()); auto setAddrRes = interface.SetIP4Address(addrMessage.address());
if (!setAddrRes) { if (!setAddrRes) {
uxlogger.Error(setAddrRes.error()); uxlogger.Error(setAddrRes.error());
@@ -133,6 +132,15 @@ void UxClient::RecvMessages(void) {
if (!setMaskRes) { if (!setMaskRes) {
uxlogger.Error(setMaskRes.error()); 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 { } else {
uxlogger.Warning("Received unknown kind of message"); uxlogger.Warning("Received unknown kind of message");
} }
@@ -143,8 +151,8 @@ void UxClient::RecvMessages(void) {
void UxClient::SendMessages(void) { void UxClient::SendMessages(void) {
while (true) { while (true) {
std::this_thread::sleep_for(std::chrono::seconds(10)); //std::this_thread::sleep_for(std::chrono::seconds(10));
continue; //continue;
auto readRes = interface.Read(); auto readRes = interface.Read();
if (!readRes) { if (!readRes) {