Sử dụng getaddrinfo() và đặt cờ gợi ý AI_NUMERICHOST, gia đình thành AF_UNSPEC, sau khi trở về thành công từ getaddrinfo, cấu trúc kết quả addrinfo .ai_family thành viên sẽ là AF_INET hoặc AF_INET6.
EDIT, ví dụ nhỏ
#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
Tôi biết rằng nó không phải là một phần của API socket, nhưng nếu IP4 và IP6 là những khả năng duy nhất, bạn không thể làm điều này với 'strlen'? ;-) –
@Steve Jessop xem xét ví dụ: ff02 :: 2 và 8.8.8.8 – nos
@nos: đủ công bằng, không nhận ra địa chỉ cũ là địa chỉ hợp lệ. Nói chung, có cách nào đó để kiểm tra các chuỗi, đó là mã đơn giản hơn so với sử dụng API socket? Trong trường hợp này, cấu trúc chứa địa chỉ được phân tích cú pháp là không cần thiết. –