#ifndef COMPLIB_SERVER_NETWORKUTILS_H #define COMPLIB_SERVER_NETWORKUTILS_H #include #include #include #include "spdlog/spdlog.h" #include #include namespace networkUtils { inline std::tuple get_current_host_and_ip() { struct ifaddrs *ifaddr, *ifa; int family, s; char host[NI_MAXHOST]; if (getifaddrs(&ifaddr) == -1) { spdlog::error("getifaddrs failed"); freeifaddrs(ifaddr); return std::tuple("", ""); } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr == NULL) continue; family = ifa->ifa_addr->sa_family; if (family == AF_INET) { s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); if (s != 0) { spdlog::error("getnameinfo() failed: {}", gai_strerror(s)); freeifaddrs(ifaddr); return std::tuple("", ""); } if (std::string(ifa->ifa_name) != "lo") { freeifaddrs(ifaddr); return std::tuple(ifa->ifa_name, std::string(host)); } } } return std::tuple("", ""); } } #endif //COMPLIB_SERVER_NETWORKUTILS_H