Files
stvpn/works/rpcvar/tunclient.cpp
T
Олег Бородин eda9b8986b working commit
2026-05-05 11:37:10 +02:00

62 lines
1.8 KiB
C++

extern "C" {
#include <netinet/ip.h>
#include <arpa/inet.h>
}
#include <expected>
#include <string>
#include <iostream>
#include <format>
#include <interface.hpp>
#include <tunclient.hpp>
std::expected<void, std::string> TClient::Create(const std::string name, const std::string addr, const int prefix) {
auto createRes = iface.Create(name);
if (!createRes) {
return std::unexpected(createRes.error());
}
auto setaddrRes = iface.SetIP4Address(addr);
if (!setaddrRes) {
return std::unexpected(setaddrRes.error());
}
auto setprefixRes = iface.SetIP4Netmask(24);
if (!setprefixRes) {
return std::unexpected(setprefixRes.error());
}
auto setmtuRes = iface.SetMTU(1240);
if (!setmtuRes) {
return std::unexpected(setmtuRes.error());
}
auto upRes = iface.Up();
if (!upRes) {
return std::unexpected(upRes.error());
}
return {};
}
std::expected<void, std::string> TClient::Run() {
while (true) {
auto readRes = iface.Read();
if (!readRes) {
std::cerr << std::format("Error: {}\n", readRes.error());
}
auto value = readRes.value();
std::cerr << std::format("Packet size: {}\n", value.size());
struct iphdr* iphdr = (struct iphdr*)(value.data());
struct in_addr src, dest;
src.s_addr = iphdr->saddr;
dest.s_addr = iphdr->daddr;
std::cout << "Source IP: " << inet_ntoa(src) << std::endl;
std::cout << "Dest IP: " << inet_ntoa(dest) << std::endl;
std::cout << "Protocol: " << (int)iphdr->protocol << std::endl;
}
return {};
}