如何获取LINUX主机所有的IP

上个月写了一篇文章,介绍了如何获取本机的第一个IP。后面我再想是否有办法获取LINUX主机的所有的IP,通过查询资料,找到了方法。

借助对象ifaddrs以及getifaddrs函数可以实现这样的功能。

     

#include 
#include 
#include 
#include 
#include 
#include 
#include 
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这样的形式展示。

编译及运行实例代码如下:

如何获取LINUX主机所有的IP_第1张图片

 

你可能感兴趣的:(通信软件,c/c++,linux,tcp/ip,socket)