Linux 获取本机IP地址

                                              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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值