使用标准C套接字API判断文本字符串是IPv6地址还是IPv4地址

我有一个程序,其中一个外部组件传递给我一个包含IP地址的字符串。 然后我需要把它变成一个URI。 对于IPv4来说这很容易; 我在前面添加http://并追加/。 但是,对于IPv6,我还需要用括号[]括起来。

是否有标准的套接字API调用来确定地址的地址族?

使用getaddrinfo ()并将提示标志AI_NUMERICHOST,family设置为AF_UNSPEC,从getaddrinfo成功返回后,生成的struct addrinfo .ai_family成员将是AF_INET或AF_INET6。

编辑,小例子

 #include  #include  #include  #include  #include  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 

的种类。 您可以使用inet_pton()尝试首先将字符串解析为IPv4( AF_INET )然后解析IPv6( AF_INET6 )。 返回代码将告诉您函数是否成功,因此字符串包含尝试类型的地址。

例如:

 #include  #include  static int ip_version(const char *src) { char buf[16]; if (inet_pton(AF_INET, src, buf)) { return 4; } else if (inet_pton(AF_INET6, src, buf)) { return 6; } return -1; } int main(int argc, char *argv[]) { for (int i = 1; i < argc; ++i) { printf("%s\t%d\n", argv[i], ip_version(argv[i])); } return 0; }