亲自测试可以读取Linux系统里所有的IP地址,但是不理解为什么会出现几次IP地址既不属于IPV4也不属于IPV6的情况,运行结果如下:
the 1 times !
the 2 times !
the 3 times !
the 4 times !
lo IPV4 Address 127.0.0.1
the 5 times !
enp2s0 IPV4 Address 192.168.7.24
the 6 times !
virbr0 IPV4 Address 192.168.122.1
the 7 times !
the 8 times !
the 9 times !
#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
int main (int argc, const char * argv[]) {
struct ifaddrs * ifAddrStruct = NULL;
void * tmpAddrPtr = NULL;
int i = 0;
getifaddrs(&ifAddrStruct);
while (ifAddrStruct != NULL)
{
if (ifAddrStruct->ifa_addr->sa_family == AF_INET)
{
// check it is IP4 is a valid IP4 Address
tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
printf("%s IPV4 Address %s\n", ifAddrStruct->ifa_name, addressBuffer);
}/*
else if (ifAddrStruct->ifa_addr->sa_family==AF_INET6)
{
// check it is IP6 is a valid IP6 Address
tmpAddrPtr=&((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("%s IPV6 Address %s\n", ifAddrStruct->ifa_name, addressBuffer);
}*/
ifAddrStruct=ifAddrStruct->ifa_next;
printf("the %d times !\n",++i);
}
freeifaddrs(ifAddrStruct);
return 0;
}