c - 使用 C 获取 IP 版本 6

标签 c linux openwrt

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

关于c - 使用 C 获取 IP 版本 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574497/

相关文章:

c - Frama-C 语法错误?

c - BCD 中的位移位

Linux:bash 脚本中的 sendmail

app-store - 使用防火墙规则限制应用商店访问

c - 如何在c中使用指针与字符进行比较?

c++ - Objective-C 还是 C++?

angularjs - yo angular-fullstack 在本地 linux 上安装失败

linux - 运行 glxgears 时出错,但 xclock 和 xeyes 在本地 OSX 计算机上通过 XForwarding 从 Linux 服务器运行

linux - 如何在 Openwrt 上获取 libc?

c - poll() 返回 POLLPRI 和 POLLERR