puedo obtener exactamente lo que usted está esperando para obtener, en Debian Lenny (glibc 2.7) - con una excepción - si especifico AI_V4MAPPED
sin AI_ALL
, y el nombre de host Miro hacia arriba ha CNAME apuntando a registros A, I don' t obtener los devueltos. Funciona bien si también se especifica AI_ALL
, o si el nombre de host está directamente asociado con los registros A.
No sé por qué, quizás sea un error glibc.
Aquí es mi programa de pruebas:
#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;
}
He estado investigando mucho más sobre esto. getaddrinfo parece estar plagado de cualquier cantidad de errores, en parte porque tiene muchos casos extraños para evitar el manejo incorrecto de las solicitudes AAAA. – Omnifarious
Su respuesta es la más cercana a una respuesta real, por lo que obtiene el crédito de respuesta. – Omnifarious
AI_V4MAPPED sin AI_ALL es un error glibc ver http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=503912 – unixman83