Cómo obtener la longitud del prefijo (máscara) de la dirección IPV6 actualmente configurada
El siguiente programa imprime la longitud de la máscara y determina la longitud del prefijo a partir de ella, ¡bien!
#include
#include
#include
#include
#include
#include
#include
#include
#include
int
principal (int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s;
char host[NI_MAXHOST];
char host_netmask[NI_MAXHOST];
struct sockaddr_in6 *pip6 = NULL;
int i;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
salir(EXIT_FAILURE);
} p> p>
/* Recorrer la lista enlazada, manteniendo el puntero principal para que
podamos liberar la lista más tarde */
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL)
continuar;
familia = ifa->ifa_addr->sa_family ;
/* Mostrar el nombre y la familia de la interfaz (incluida la forma simbólica
de esta última para las familias comunes) */
printf("%s familia de direcciones : % d%s\n",
ifa->ifa_name, familia,
(familia == AF_PACKET)? " (AF_PACKET)" :
(familia == AF_INET) ? " (AF_INET)" :
(familia == AF_INET6) ? " (AF_INET6)" : "");
/* Para un AF_INET* dirección de interfaz, muestra la dirección */
if (family == AF_INET || family == AF_INET6) {
s = getnameinfo(ifa->ifa_addr,
(familia == AF_INET) ?
ddr_in):
sizeof(struct sockaddr_in6),
host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() falló: %s\n", gai_strerror(s));
salir(EXIT_FAILURE);
}
getnameinfo(ifa->ifa_netmask,
(familia == AF_INET)? sizeof(struct sockaddr_in): sizeof(struct sockaddr_in6),
host_netmask, NI_MAXHOST, NULL, 0 , NI_NUMERICHOST);
if(AF_INET6==familia)
{
pip6 = (struct sockaddr_in6 *)(ifa->ifa_netmask);
char *p = (char *)&(pip6->sin6_addr);
for(i=0;i<16;i++)
{
printf("%d ",*p);
p++;
}
}
printf(" \taddress: <%s>\n", host);
printf("\tnetmaks: <%s>\n", host_netmask);
}
}
freeifaddrs(ifaddr);
salir(EXIT_SUCCESS);
}