0

私の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.2関係しているの8393376でしょうか。

IPアドレスを見つける2つの方法から、それらは一致しないようです。

4

2 に答える 2

1
 id->ifa_addr

アドレスのタイプ (例: IPv4、IPv6、イーサネット MAC アドレスなど) と、アドレスのバイナリ表現を含む何らかの種類struct sockaddr(例: a ) です。struct sockaddr_inprintf の %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);
于 2013-09-22T22:49:56.987 に答える