上个月写了一篇文章,介绍了如何获取本机的第一个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这样的形式展示。
编译及运行实例代码如下:
标签:ifpoint,addr,IP,LINUX,ifa,主机,ifhead,include,struct From: https://blog.51cto.com/u_15942605/6017169