Если вы хотите отслеживать изменения и статус IPv6-адресов, вы можете использовать мой пример , который вы упомянули.
Если вас интересует только уведомление об IPv6-адресах, вы должны заменить эту строку:
local.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
с этим:
local.nl_groups = RTMGRP_IPV6_IFADDR;
Вот что вы должны сделать в случае RTM_NEWADDR / RTM_DELADDR:
struct ifaddrmsg *ifa = NLMSG_DATA(h);
struct rtattr *tb[IFLA_MAX + 1];
parseRtattr(tb, IFA_MAX, IFA_RTA(ifa), h->nlmsg_len - NLMSG_LENGTH(sizeof(*ifa)));
if (!tb[IFA_LOCAL]) {
tb[IFA_LOCAL] = tb[IFA_ADDRESS];
}
if (!tb[IFA_ADDRESS]) {
tb[IFA_ADDRESS] = tb[IFA_LOCAL];
}
char ifAddress[INET6_ADDRSTRLEN];
switch (h->nlmsg_type) {
case RTM_NEWADDR:
if (tb[IFA_LOCAL]) {
inet_ntop(AF_INET6, RTA_DATA(tb[IFA_LOCAL]), ifAddress, sizeof(ifAddress));
printf("New local IPv6 address: %s\n", ifAddress);
} else if (tb[IFA_BROADCAST]) {
inet_ntop(AF_INET6, RTA_DATA(tb[IFA_BROADCAST]), ifAddress, sizeof(ifAddress));
printf("New local IPv6 address: %s\n", ifAddress);
} else if (tb[IFA_ANYCAST]) {
inet_ntop(AF_INET6, RTA_DATA(tb[IFA_ANYCAST]), ifAddress, sizeof(ifAddress));
printf("New anycast IPv6 address: %s\n", ifAddress);
}
if (tb[IFA_CACHEINFO]) {
struct ifa_cacheinfo *ci = RTA_DATA(tb[IFA_CACHEINFO]);
if (ci->ifa_valid == 0xFFFFFFFFU) {
printf("ifa_valid infinity\n");
} else {
printf("ifa_valid = %u sec\n", ci->ifa_valid);
}
if (ci->ifa_prefered == 0xFFFFFFFFU) {
printf("ifa_prefered = %u sec\n", ci->ifa_prefered);
}
}
break;
case RTM_DELADDR:
printf("IPv6 address was deleted\n");
break;
}
Это быстрый и грязный примерно вы должны увидеть, как это работает.В этом примере мы обрабатываем данные ifaddrmsg в сообщении netlink, получая назначенный адрес ipv6.
Возможно, самая интересная часть - это IFA_CACHEINFO.На этом этапе мы можем проверить кэш адресов и получить некоторую полезную информацию о допустимых и предпочтительных состояниях адреса.Как вы можете видеть, здесь может быть установлен тайм-аут или бесконечность.Вы можете поиграть с сетевым интерфейсом, чтобы обнаружить различные состояния адреса IPv6 и состояния IFA_CACHEINFO.