使用C获取IP版本6

时间:2016-02-23 10:09:05

标签: c linux openwrt

我可以使用以下代码

获取给定接口的IPv4地址
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));

使用C?

获取给定接口的IPv6地址的最简单方法是什么?

***我发布的代码可以用来制作以下代码..

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

2 个答案:

答案 0 :(得分:1)

我认为您的操作系统是Linux。

要了解如何完成,请尝试strace ifconfig eth0

您看到它正在使用/proc/net/if_inet6和一些ioctl,尤其是SIOCGIFADDR

Ctx所述,您可能需要getifaddrs(3)

答案 1 :(得分:1)

最简单的方法是使用 getifaddrs(),以防你的glibc支持它。

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