extern "C" { #include #include } #include #include #include #include #include #include std::expected 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 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 {}; }