Приветствую
Суть задачи проста - получить параметры одного или всех сетевых интерфейсов, понятно что можно в векторе, например, вернуть, но можно как то вот хитрожопо сделать через std::function или что то иное есть??? Так чтобы снаружи вызова можно было построчно обработать.
код, в котором не догоняю как можно getIPs и getIP реализовать, чтобы потом их вызывать можно было???
std::string getSockToIP(const struct sockaddr * psa)
{
uint8_t laddr = 0;
char * addr = nullptr;
std::string rt("");
switch (psa->sa_family)
{
case AF_INET:
addr = (char*)calloc(laddr = INET_ADDRSTRLEN, sizeof(char));
break;
case AF_INET6:
addr = (char*)calloc(laddr = INET6_ADDRSTRLEN, sizeof(char));
break;
}
if (laddr > 0)
{
inet_ntop(psa->sa_family, &((struct sockaddr_in*)(psa))->sin_addr, addr, laddr);
rt.assign(addr);
free(addr);
}
return rt;
}
std::string getIPAddr(const struct ifaddrs * pifa)
{
std::string rt(pifa->ifa_name);
if (pifa->ifa_addr)
rt += " " + getSockToIP(pifa->ifa_addr);
if (pifa->ifa_netmask)
rt += " " + getSockToIP(pifa->ifa_netmask);
return rt;
}
bool getIFAddrs(std::function<bool(struct ifaddrs * pifa)> cbFunc)
{
struct ifaddrs * pifa = nullptr;
if (getifaddrs(&pifa))
return false;
else
{
for (struct ifaddrs * p = pifa; !p; p = p->ifa_next)
if (cbFunc(p))
break;
freeifaddrs(pifa);
return true;
}
}
void getIPs(std::function<std::string(void)> cbFunc)
{
getIFAddrs([&](struct ifaddrs * pifa)
{
//getIPAddr(pifa)
return false;
});
}
void getIP(const char * dev)
{
getIFAddrs([&](struct ifaddrs * pifa)
{
//getIPAddr(pifa)
return !strcmp(pifa->ifa_name, dev);
});
}