난 당신이 데비안 레니 (2.7 glibc가)에 얻을 것으로 예상하고 정확하게 얻을 내가 AI_ALL
없이 AI_V4MAPPED
를 지정하면, 내가 찾아 호스트 이름은 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;
}
출처
2009-09-12 13:56:04
caf
나는 이것에 대해 더 많은 연구를 해왔다. getaddrinfo는 AAAA 요청을 처리하지 못하게하는 이상한 경우가 많기 때문에 버그가 많은 것으로 보입니다. – Omnifarious
답변은 실제 답변에 가장 근접하므로 답변 크레딧을받습니다. – Omnifarious
AI_ALL이없는 AI_V4MAPPED는 glibc 버그입니다. http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=503912를 참조하십시오. – unixman83