2016-12-17 1 views
0

私が使用している現在のワイヤレスインターフェイスのIPアドレスを取得します。そのためには、ifaddrs.hライブラリからgetnameinfo()関数を使用します。私の問題は、この関数が実際のIPアドレスではなく、ジャンク値を返すことです。ここでifaddrs.hからのgetnameinfo()は、Cのジャンク値を返します

は、私が使用する関数です。

void getWIFromSystem(WI **WIHead) { 
    struct ifaddrs *ifaddr, *ifa; 
    char host[NI_MAXHOST]; 

    if (getifaddrs(&ifaddr) == -1) { 
    perror("getifaddrs"); 
    exit(-1); 
    } 

    /* Walk through linked list, maintaining head pointer so we 
    can free list later */ 
    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { 
    if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET) { 
     continue; 
    } 

    if (check_wireless(ifa->ifa_name)) {//we want only wireless interfaces 
     //getWIAdress(ifa->ifa_name, host); 
     getnameinfo(ifa->ifa_addr, (ifa->ifa_addr->sa_family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 
     addWI(&WIHead, ifa->ifa_name, host); 
    } 
    } 

    freeifaddrs(ifaddr); 
} 

私は、私が作成した別の関数の問題を解決するために管理しますが、私はgetnameinfo()

私の他の機能を使用してジャンク値を取得する理由を私は理解できませんそれは、問題を解決:ジャンク値の

void getWIAdress(char *name, char *host) { 
    int fd; 
    struct ifreq ifr; 

    fd = socket(AF_INET, SOCK_DGRAM, 0); 

    /* I want to get an IPv4 IP address */ 
    ifr.ifr_addr.sa_family = AF_INET; 

    /* I want IP address attached to specified name */ 
    strncpy(ifr.ifr_name, name, IFNAMSIZ-1); 

    ioctl(fd, SIOCGIFADDR, &ifr); 

    close(fd); 

    /* copy result */ 
    strcpy(host, inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 
} 

スクリーンショット:

enter image description here

+0

最初の 'if'は' sa_family'が常に 'AF_PACKET'であることを保証します。だから 'getnameinfo()'を呼び出すときに 'AF_INET'に対してなぜテストしていますか?私は返されたエラーコードをチェックする必要があると思います。 – Barmar

+0

@Barmarあなたは 'getnameinfo'からどういう意味ですか?はい、それは負の値を与えます。うーん、どうすれば修正できますか? –

+0

はい。 'getnameinfo'は、成功すれば' 0'を、そうでなければエラーコードを返します。マニュアルページには、すべてのエラーコードがリストされています。 – Barmar

答えて

0

問題は、この状態にあった:

if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_PACKET) 

は、我々はAF_INETAF_PACKETを変更する必要があります。これにより、airmon-ngによって生成された仮想インターフェイスをaircrack-ngパッケージからバイパスすることもできます。

AF_INETgetnameinfo()にチェックする必要はありません。私たちはIPv4アドレスに固執しています。

getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); 
関連する問題