gpt4 book ai didi

networking - getaddrinfo 中 AI_V4MAPPED 标志的用途是什么?

转载 作者:行者123 更新时间:2023-12-03 16:42:21 25 4
gpt4 key购买 nike

getaddrinfo 调用有许多有趣的标志。我想知道 AI_V4MAPPED 标志的目的是什么。在任何系统上,我似乎都无法获得 getaddrinfo 来生成::ffff:n.n.n.n 表单地址,正如我在设置此标志时所期望的那样。我期待错了吗?我看到错误了吗?

特别是,如果我要求 AF_INET6 系列地址并指定 AI_V4MAPPED,我希望看到::ffff:n.n.n.n 地址的主机只有 DNS A(IPv4 地址)记录。而且我通常还希望,如果我指定 AI_ALL,我将同时获得主机的 DNS AAAA(IPv6 地址)记录和::ffff:n.n.n.n 形式的 DNS A 记录。

再说一次,我是否期待这里所有错误的事情?

我已经在 Fedora 11 - glibc 2.10.1 和 OS X 10.4 上测试过这个。

最佳答案

在 Debian Lenny (glibc 2.7) 上,如果我指定 AI_V4MAPPED,我会得到您所期望的结果——只有一个异常(exception)——没有 AI_ALL ,我查找的主机名有 CNAME 指向 A 记录,我没有得到那些返回。如果 AI_ALL 就可以正常工作也指定,或者如果主机名直接与 A 记录关联。

我不知道为什么 - 也许这是一个 glibc 错误?

这是我的测试程序:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
struct addrinfo hints = { 0 };
struct addrinfo *res, *res_c;
int err;
char name[INET6_ADDRSTRLEN];

if (argc < 2)
{
return 1;
}

hints.ai_family = AF_INET6;
hints.ai_flags = AI_V4MAPPED | AI_ALL;

err = getaddrinfo(argv[1], NULL, &hints, &res);

if (err)
{
printf("getaddrinfo: %s\n", gai_strerror(err));
return 1;
}

for (res_c = res; res_c; res_c = res_c->ai_next)
{
const void *addr;
int port;
struct protoent *proto;

switch (res_c->ai_family)
{
case AF_INET6:
addr = &((struct sockaddr_in6 *)(res_c->ai_addr))->sin6_addr;
port = ((struct sockaddr_in6 *)(res_c->ai_addr))->sin6_port;
printf("AF_INET6\t");
break;
case AF_INET:
addr = &((struct sockaddr_in *)(res_c->ai_addr))->sin_addr;
port = ((struct sockaddr_in *)(res_c->ai_addr))->sin_port;
printf("AF_INET\t");
break;
default:
addr = NULL;
printf("(%d)\t", res_c->ai_family);
}

proto = getprotobynumber(res_c->ai_protocol);
if (proto)
{
printf("%s\t", proto->p_name);
}
else
{
printf("(%d)\t", res_c->ai_protocol);
}

switch (res_c->ai_socktype)
{
case SOCK_STREAM:
printf("SOCK_STREAM\t");
break;

case SOCK_DGRAM:
printf("SOCK_DGRAM\t");
break;

default:
printf("(?socktype?)\t");
break;
}

if (addr && inet_ntop(res_c->ai_family, addr, name, sizeof name))
printf("addr = %s", name);

if (addr)
printf(",%d", port);

printf("\n");
}

return 0;
}

关于networking - getaddrinfo 中 AI_V4MAPPED 标志的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1408030/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com