Red de conocimiento informático - Conocimiento informático - Cómo obtener la longitud del prefijo (máscara) de la dirección IPV6 actualmente configurada

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>

/* 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);

}