getifaddrs和ipconfig的IP地址不匹配

时间:2013-09-22 22:40:37

标签: networking

在我的Mac上,我做了一个命令行

ipconfig getifaddr en1

并显示

10.0.0.2

但是当我使用

struct ifaddrs *id;
int success=0;
success=getifaddrs(&id);
printf("Network Address of %s :- %d\n",id->ifa_name,id->ifa_addr);

显示

Network Address of lo0 :- 8393376

那么,10.0.0.28393376的关系如何?

似乎它们与找到IP地址的两种方式不匹配。

2 个答案:

答案 0 :(得分:1)

 id->ifa_addr

是某种struct sockaddr(例如struct sockaddr_in),其中包含的类型 地址(例如IPv4,IPv6,以太网MAC地址或类似地址)和 地址的二进制表示。它不是可以使用printf的%s打印的字符串。

您可以使用此功能:

void
print_sockaddr(struct sockaddr* addr,const char *name)
{
    char addrbuf[128] ;

    addrbuf[0] = 0;
    if(addr->sa_family == AF_UNSPEC)
        return;

    switch(addr->sa_family) {
    case AF_INET:
        inet_ntop(addr->sa_family,&((struct sockaddr_in*)addr)->sin_addr,
                  addrbuf,sizeof(struct sockaddr_in));
        break;
    case AF_INET6:
        inet_ntop(addr->sa_family, &((struct sockaddr_in6*)addr)->sin6_addr,
                  addrbuf,sizeof(struct sockaddr_in6));
        break;
    default:
        sprintf(addrbuf,"Unknown family (%d)",(int)addr->sa_family);
        break;

    }
    printf("%-16s %s\n",name,addrbuf);
}

...

print_sockaddr(id->ifa_addr,id->ifa_name);

getifaddrs返回struct ifaddrs的链接列表,代表每个接口。

你需要这样做:

struct ifaddrs *addrs,*tmp;

if(getifaddrs(&addrs) != 0) {
    perror("getifaddrs");
    return 1;
}
for(tmp = addrs; tmp ; tmp = tmp->ifa_next) {
    print_sockaddr(tmp->ifa_addr, tmp->ifa_name);
}
freeifaddrs(addrs);

答案 1 :(得分:0)

老兄,要打印你需要的IP,请执行以下操作:

struct sockaddr_in * ip;
ip = (struct sockaddr_in *) id->ifa_addr;

if (ip->sin_family == AF_INET)
    printf("Network Address: %s\n",inet_ntoa(ip->sin_addr));

尝试这样做。