上个月写了一篇文章,介绍了如何获取本机的第一个IP。后面我再想是否有办法获取LINUX主机的所有的IP,通过查询资料,找到了方法。
借助对象ifaddrs以及getifaddrs函数可以实现这样的功能。
#include <arpa/inet.h> #include <sys/socket.h> #include <netdb.h> #include <ifaddrs.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main() { char hostname[100]={0}; char localIpAddress[256]={0}; struct hostent *h; gethostname(hostname,sizeof(hostname)); printf("host name is %s \n",hostname); h=gethostbyname(hostname); //struct in_addr *temp; //temp=(struct in_addr *)h->h_addr; //strcpy(localIpAddress,inet_ntoa(*temp)); //printf("first ip is %s\n",localIpAddress); char mac[30]={0}; struct ifaddrs * ifhead=NULL; struct ifaddrs * ifpoint=NULL; struct in_addr * intmpAddrPtr=NULL; getifaddrs(&ifhead); ifpoint=ifhead; while(ifpoint!=NULL) { if(ifpoint->ifa_addr->sa_family==AF_INET) { intmpAddrPtr=&((struct sockaddr_in *)ifpoint->ifa_addr)->sin_addr; char addressBuffer[INET_ADDRSTRLEN]; inet_ntop(AF_INET, intmpAddrPtr, addressBuffer, INET_ADDRSTRLEN); printf("%s IPv4: %s\n", ifpoint->ifa_name, addressBuffer); } else if(ifpoint->ifa_addr->sa_family==AF_INET6) { intmpAddrPtr=&((struct sockaddr_in *)ifpoint->ifa_addr)->sin_addr; char addressBuffer[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, intmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN); printf("%s IPv6: %s\n", ifpoint->ifa_name, addressBuffer); } ifpoint=ifpoint->ifa_next; } if (ifhead) { freeifaddrs(ifhead); ifhead = NULL; } }
其中通过ifpoint=ifpoint->ifa_next;可以实现对主机IP的遍历查看。通过intmpAddrPtr=&((struct sockaddr_in *)ifpoint->ifa_addr)->sin_addr;可以获取到in_addr的指针。通过函数inet_ntop可以将16进制的IP地址转成字符形式的XX.XX.XX.XX这样的形式展示。
编译及运行实例代码如下: