linux 下获得本机的ipv6地址

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <net/if.h>

#include <sys/ioctl.h>

#include <ifaddrs.h>

 

#define IFI_NAME 16 /* same as IFNAMSIZ in <net/if.h> */

#define IFI_HADDR 8 /* allow for 64-bit EUI-64 in future */

 

struct ifi_info {

      char    ifi_name[IFI_NAME]; /* interface name, null-terminated */

      short   ifi_index; /* interface index */

      short   ifi_flags; /* IFF_xxx constants from <net/if.h> */

      struct sockaddr  *ifi_addr; /* primary address */

      struct sockaddr  *ifi_brdaddr;/* broadcast address */

      struct ifi_info  *ifi_next; /* next of these structures */

};

 

 

struct ifi_info* get_ifi_info() {

    struct ifi_info *ifi, *ifihead, **ifipnext,*p;

struct sockaddr_in6 *sin6ptr;

struct ifaddrs *ifas;

// char addr[128];

int sockfd;

ifihead = NULL;

ifipnext = &ifihead;

if(getifaddrs(&ifas)!=0) return;

for(;ifas!=NULL;ifas=(*ifas).ifa_next)

{

   if(((*ifas).ifa_addr)->sa_family!=AF_INET6) continue;

   ifi=(struct ifi_info*)calloc(1,sizeof(struct ifi_info));

   *ifipnext=ifi;

   ifipnext=&ifi->ifi_next;

   ifi->ifi_flags=(*ifas).ifa_flags;

   memcpy(ifi->ifi_name,(*ifas).ifa_name,IFI_NAME);

   ifi->ifi_name[IFI_NAME]='/0';

   /**/

   sin6ptr=(struct sockaddr_in6*)(*ifas).ifa_addr;

   ifi->ifi_addr=(struct sockaddr*)calloc(1,sizeof(struct sockaddr_in6));

   memcpy(ifi->ifi_addr,sin6ptr,sizeof(struct sockaddr_in6));

}

freeifaddrs(ifas);

return(ifihead);

}

 

int main()

{

    char addr[128];

    struct ifi_info *ifi,*ifihead;

    for(ifihead=ifi=get_ifi_info();ifi!=NULL;ifi=ifi->ifi_next)

    {

if(0!=strcmp("eth0",ifi->ifi_name)) continue;

inet_ntop(AF_INET6,&(((struct sockaddr_in6 *)(ifi->ifi_addr))->sin6_addr),addr,sizeof(addr));

printf("eth0: %s/n",addr);

    }

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值