迭代两个 IPV6 地址之间的地址范围

Ami*_*iGO 3 c iteration ipv6

我需要某种方法来迭代两个 IPv6 地址之间的地址范围。即,如果第一个 IP 是2a03:6300:1:103:219:5bff:fe31:13e1,第二个 IP 是2a03:6300:1:103:219:5bff:fe31:13f4,我想访问该范围内的 19 个地址。

对于 IPv4,我只需在结果结构中inet_aton进行字符串表示和获取htonls_addr但是对于 IPv6 我该如何做到这一点呢?

为了简化:

struct in6_addr sn,en;
long i;

s="2a03:6300:1:103:219:5bff:fe31:13e1";
e="2a03:6300:1:103:219:5bff:fe31:13f4";

inet_pton(AF_INET6,s,&sn);
inet_pton(AF_INET6,e,&en);
Run Code Online (Sandbox Code Playgroud)

[..]

for (i = _first_ipv6_representation; i<=_second_ipv6_representation; i++){
    /* stuck here */
}
Run Code Online (Sandbox Code Playgroud)

use*_*116 5

根据您的评论删除旧答案,更新以迭代一系列地址:

char output[64];
struct in6_addr sn, en;
int octet;

s="2a03:6300:1:103:219:5bff:fe31:13e1";
e="2a03:6300:1:103:219:5bff:fe31:13f4";

inet_pton(AF_INET6,s,&sn);
inet_pton(AF_INET6,e,&en);

for ( ; ; ) {
    /* print the address */
    if (!inet_ntop(AF_INET6, &sn, output, sizeof(output))) {
        perror("inet_ntop");
        break;
    }

    printf("%s\n", output);

    /* break if we hit the last address or (sn > en) */
    if (memcmp(sn.s6_addr, en.s6_addr, 16) >= 0) break;

    /* increment sn, and move towards en */
    for (octet = 15; octet >= 0; --octet) {
        if (sn.s6_addr[octet] < 255) {
            sn.s6_addr[octet]++;
            break;
        } else sn.s6_addr[octet] = 0;
    }

    if (octet < 0) break; /* top of logical address range */
}
Run Code Online (Sandbox Code Playgroud)