Utilice getaddrinfo() y establezca la bandera de sugerencia AI_NUMERICHOST, familia en AF_UNSPEC, al devolver exitosamente desde getaddrinfo, el miembro struct addrinfo .ai_family resultante será AF_INET o AF_INET6.
EDITAR, pequeño ejemplo
#include <sys/types.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
struct addrinfo hint, *res = NULL;
int ret;
memset(&hint, '\0', sizeof hint);
hint.ai_family = PF_UNSPEC;
hint.ai_flags = AI_NUMERICHOST;
ret = getaddrinfo(argv[1], NULL, &hint, &res);
if (ret) {
puts("Invalid address");
puts(gai_strerror(ret));
return 1;
}
if(res->ai_family == AF_INET) {
printf("%s is an ipv4 address\n",argv[1]);
} else if (res->ai_family == AF_INET6) {
printf("%s is an ipv6 address\n",argv[1]);
} else {
printf("%s is an is unknown address format %d\n",argv[1],res->ai_family);
}
freeaddrinfo(res);
return 0;
}
$ ./a.out 127.0.0.1
127.0.0.1 is an ipv4 address
$ ./a.out ff01::01
ff01::01 is an ipv6 address
Sé que no es parte de la API de sockets, pero si IP4 e IP6 son las únicas posibilidades, ¿no puedes hacer esto con 'strlen'? ;-) –
@Steve Jessop considere, p. ff02 :: 2 y 8.8.8.8 – nos
@nos: bastante justo, no se dio cuenta de que el primero era una dirección válida. De manera más general, ¿hay alguna manera de examinar las cadenas, es un código más simple que usar la API de sockets? En este caso, la estructura que contiene la dirección analizada no es necesaria. –