使用 C 获取 IP 版本 6



我能够使用以下代码获取给定接口的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;
}

我假设你的操作系统是Linux。

要了解它是如何完成的,请尝试 strace ifconfig eth0 .

你看到它正在使用/proc/net/if_inet6和一些 ioctl,特别是SIOCGIFADDR

正如 Ctx 评论的那样,您可能想要 getifaddrs(3)

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

如果没有,你最好不要想知道.....

最新更新