【问题标题】:Getting IP version 6 using C使用 C 获取 IP 版本 6
【发布时间】:2016-02-23 10:09:05
【问题描述】:

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

【问题讨论】:

  • 这是特定于操作系统的。标准 C 中不存在套接字或网络接口。您可能需要添加 PosixLinux 标记
  • OpenWRT平台,基于Linux。
  • 您真的需要特定接口的 v6 地址还是系统的主地址需要? (例如,用于传出连接的地址)

标签: c linux openwrt


【解决方案1】:

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

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

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

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

【讨论】:

  • strace 的问题在于,解决方案通常非常低级(因为它只显示通过内核接口的调用),其中可能存在用户空间中的更清洁(和更稳定的版本) .在这种情况下,例如 getifaddrs() 应该尽可能首选。
  • 我可以看到它正在通过该 proc 文件。 proc文件中的值是fe80000000000000228984fffea6c63d,而我的ip6是fe80::2289:84ff:fea6:c63d。你知道怎么转换吗?
  • 我可以按照你的想法去做。谢谢。我将发布代码。
【解决方案2】:

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

如果不是你最好不要知道.....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多