Linux 获取本机IP地址

来源:互联网 发布:mac开机怎么切换系统 编辑:程序博客网 时间:2024/06/05 09:57
                       Linux 获取本机IP地址
 
IP地址分为IPv4和IPv6,本文只验证了IPv4的获取,至于IPv6还没有验证。
 
说明:
family = AT_INET :IPv4
family = AT_INET6:IPv6
address: 提取得到的IP地址所要保存的地址
size =strlen(sampleIP) 192.168.123.128
      MAX_IPv4 =15
某些头文件应在其他方面,在本程序中没用得上。不过不影响程序的编译。
program list:
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <sys/types.h>
#include <net/if.h>
#include <ifaddrs.h>
#include<unistd.h>    
#include<sys/stat.h>  
#include<fcntl.h>     
#include<termios.h>   
#include<errno.h>     


 int GetIP_v4_and_v6_linux(int family, char*address, int size)
{
   struct ifaddrs *ifap0,*ifap;
   char buf[NI_MAXHOST];
   char *interface ="eth0";
   struct sockaddr_in*addr4;
   struct sockaddr_in6*addr6;
   int ret;
  
   if( NULL == address )
         
      return-1;   
      
  if(getifaddrs(&ifap0))
    
      return-1;  
     }
    
   for( ifap = ifap0; ifap !=NULL; ifap=ifap->ifa_next)
    {
     if(strcmp(interface, ifap->ifa_name) != 0)continue;
     if(ifap->ifa_addr==NULL) continue;
     if ((ifap->ifa_flags & IFF_UP) == 0)continue;
     if(family != ifap->ifa_addr->sa_family)continue;
     if(AF_INET ==ifap->ifa_addr->sa_family)
      {
       addr4 =(struct sockaddr_in *)ifap->ifa_addr;
       if ( NULL !=inet_ntop(ifap->ifa_addr->sa_family,  
          (void *)&(addr4->sin_addr), buf, NI_MAXHOST) )
           {
            if(size strlen(buf) ) break;
            strcpy(address, buf);
            printf("IPv4=%s\n",address);//testing
            freeifaddrs(ifap0);
            return 0;
           }
     else break;
                       
      }
    else if(AF_INET6 == ifap->ifa_addr->sa_family)
       {
        addr6 =(struct sockaddr_in6 *)ifap->ifa_addr;
       if(IN6_IS_ADDR_MULTICAST(&addr6->sin6_addr))
          { continue;
          }
       if(IN6_IS_ADDR_LINKLOCAL(&addr6->sin6_addr))
          {continue;
           
       if(IN6_IS_ADDR_LOOPBACK(&addr6->sin6_addr))
          { continue;
          }
       if(IN6_IS_ADDR_UNSPECIFIED(&addr6->sin6_addr))
          { continue;
          }
       if(IN6_IS_ADDR_SITELOCAL(&addr6->sin6_addr))
          {continue;
          }
        if ( NULL !=inet_ntop(ifap->ifa_addr->sa_family,
          (void *)&(addr6->sin6_addr), buf, NI_MAXHOST) )
           { if(size  strlen(buf) )break;
            strcpy(address, buf);
            printf("IPv6=%s\n",address);//testing
            freeifaddrs(ifap0); 
            return0;           
           }
        elsebreak;    
       
    }
    
}

void * getIPv4()
{
  static int SIZE ;
  static char IP[64];
  char *sampleIPv4="192.168.123.128";
  SIZE = strlen(sampleIPv4);
 
  GetIP_v4_and_v6_linux(AF_INET ,IP ,SIZE);
 
  printf("IP=%s\n",IP);
  return IP;
 
}

本程序非原创,也不清楚原创作者是何人。本人只是拿来修改,并应用在实际的工程项目中去。感谢原创作者和网络上的无私奉献的Linux工作者!让我们共同发扬Linux的精神! 

    Enjoyit!

0 0