linux ip命令ipv4,linux下获取本机ip地址,ipv4和ipv6

linux下获取本机ip地址,ipv4和ipv6

#include

#include

#include

#include

#include

#include

#include

#include

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);

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);

freeifaddrs(ifap0);

return 0;

}

else break;

}

}

freeifaddrs(ifap0);

return -1;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值