2016-02-23 30 views
0

我能夠用下面的代碼獲取IP版本6採用C

int fd; 
char ipv4[33]; 
char ifname[] = "eth0"; 
struct ifreq ifr; 

fd = socket(AF_INET, SOCK_DGRAM, 0); 
ifr.ifr_addr.sa_family = AF_INET; 
strncpy(ifr.ifr_name, ifname, IFNAMSIZ-1); 
ioctl(fd, SIOCGIFADDR, &ifr); 
close(fd); 

snprintf(ipv4, 33, "%s", inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr)); 

什麼是獲得一個給定的接口的IPv6地址,用C最簡單的方式來獲得一個給定的接口的IPv4地址?

***我張貼的代碼,我可以用它來使之低於..

int8_t find_device_ipv6(const char *ifname, char *ipv6, int8_t ipv6_size) 
{ 
    FILE *f; 
    int ret, scope, prefix; 
    unsigned char _ipv6[16]; 
    char dname[IFNAMSIZ]; 
    char address[INET6_ADDRSTRLEN]; 
    char *scopestr; 

    f = fopen("/proc/net/if_inet6", "r"); 
    if (f == NULL) { 
     return -1; 
    } 
    while (19 == fscanf(f, 
         " %2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx%2hhx %*x %x %x %*x %s", 
         &_ipv6[0], 
         &_ipv6[1], 
         &_ipv6[2], 
         &_ipv6[3], 
         &_ipv6[4], 
         &_ipv6[5], 
         &_ipv6[6], 
         &_ipv6[7], 
         &_ipv6[8], 
         &_ipv6[9], 
         &_ipv6[10], 
         &_ipv6[11], 
         &_ipv6[12], 
         &_ipv6[13], 
         &_ipv6[14], 
         &_ipv6[15], 
         &prefix, 
         &scope, 
         dname)) { 
     if (strcmp(ifname, dname) != 0) { 
      continue; 
     } 
     if (inet_ntop(AF_INET6, _ipv6, address, sizeof(address)) == NULL) { 
      continue; 
     } 
     snprintf(ipv6, ipv6_size, "%s", address); 
    } 
    fclose(f); 

    return 0; 
} 
+0

這是操作系統特定的。標準C中不存在套接字或網絡接口。您可能希望添加一個「Posix」或「Linux」標記 –

+0

它基於Linux,位於OpenWRT平臺上。 – BlueBird

+4

也許重複http://stackoverflow.com/questions/20743709/get-ipv6-addresses-in-linux-using-ioctl –

回答

1

我假設你的操作系統是Linux操作系統。

要了解它是如何完成的,請嘗試strace ifconfig eth0

你看它使用/proc/net/if_inet6和一些IOCTL,特別是SIOCGIFADDR

由於Ctx評論,你可能想getifaddrs(3)

+1

strace的問題在於,解決方案通常很低級(因爲它只顯示通過內核接口的調用),其中清理程序(以及更多版本穩定)可能存在於userland中。在這種情況下,例如'getifaddrs()'應該是可能的。 – Ctx

+0

我可以看到它正在通過該proc文件。 proc文件中的值是'fe80000000000000228984fffea6c63d',而我的ip6是'fe80 :: 2289:84ff:fea6:c63d'。你知道如何轉換它嗎? – BlueBird

+0

我可以用你的想法做到這一點。謝謝。我將發佈代碼。 – BlueBird

1

最簡單的方法是絕對使用getifaddrs(),如果你的glibc支持它。

如果它不是你最好不想知道.....