Для пояснения:
Я использую это для некоторых прокси-серверов с большим количеством привязанного IPv6 и для делегирования нового IP для каждого запроса.
Моя функция приращения с некоторыми дополнительнымиобъяснение:
const char *s="2a03:6300:2:200:0:0:0:1"; // first ip in range
struct in6_addr sn;
inet_pton(AF_INET6,s,&sn);
static struct in6_addr cn = sn; //current ip in6_addr struct
unsigned int skipBits=126;
unsigned __int128 icn,skip; // works only with gcc
if (skipBits!=0){ // now we need to skip netmask bits to get next ip
skip=pow(2,(128-skipBits))-2;
u_int32_t swap;
swap=ntohl(cn.s6_addr32[3]);
cn.s6_addr32[3]=ntohl(cn.s6_addr32[0]);
cn.s6_addr32[0]=swap;
swap=ntohl(cn.s6_addr32[2]);
cn.s6_addr32[2]=ntohl(cn.s6_addr32[1]);
cn.s6_addr32[1]=swap;
memcpy(&icn,&cn,sizeof icn);
// increment, works very fast because gcc will compile it into sse2 intrinsic (double int64 operations)
icn+=skip;
memcpy(&cn,&icn,sizeof icn);
swap=ntohl(cn.s6_addr32[3]);
cn.s6_addr32[3]=ntohl(cn.s6_addr32[0]);
cn.s6_addr32[0]=swap;
swap=ntohl(cn.s6_addr32[2]);
cn.s6_addr32[2]=ntohl(cn.s6_addr32[1]);
cn.s6_addr32[1]=swap;
}
Я не показываю функцию сравнения, потому что решение @sixlettervariables работает достаточно хорошо.