Nat*_*han 9 c sockets network-programming
我有一个程序,其中一个外部组件传递给我一个包含IP地址的字符串.然后我需要把它变成一个URI.对于IPv4来说这很容易; 我在前面加上http://并追加/.但是,对于IPv6,我还需要用括号[]括起来.
是否有标准的套接字API调用来确定地址的地址族?
lla*_*ram 21
的种类.您可以inet_pton()尝试首先将字符串解析为IPv4(AF_INET)然后解析IPv6(AF_INET6).返回代码将告诉您函数是否成功,因此字符串包含尝试类型的地址.
例如:
#include <arpa/inet.h>
#include <stdio.h>
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;
}
Run Code Online (Sandbox Code Playgroud)
nos*_*nos 13
使用getaddrinfo()并将提示标志AI_NUMERICHOST,family设置为AF_UNSPEC,从getaddrinfo成功返回后,生成的struct addrinfo .ai_family成员将是AF_INET或AF_INET6.
编辑,小例子
#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
Run Code Online (Sandbox Code Playgroud)