Kullanım getaddrinfo() ve getaddrinfo gelen başarılı dönüşünde ipucu bayrak AI_NUMERICHOST, AF_UNSPEC aileyi, set, .ai_family üyesi addrinfo çıkan yapı ya AF_INET veya AF_INET6'dan olacaktır.
DÜZENLEME, küçük örnek
#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
Soket API'sinin bir parçası olmadığını biliyorum, ancak IP4 ve IP6 tek olasılıksa, bunu strlen ile yapamaz mısınız? ;-) –
@Steve Jessop, ör. ff02 :: 2 ve 8.8.8.8 – nos
@nos: yeterince adil, eski geçerli bir adres olduğunu bilmiyordum. Daha genel olarak, dizeleri incelemek için bir yol var mı, bu soket API'yi kullanmaktan daha basit bir kod mu? Bu durumda ayrıştırılmış adresi içeren yapıya gerek yoktur. –