मैं वास्तव में क्या आप प्राप्त करने के लिए उम्मीद कर रहे हैं, डेबियन लेनी (glibc 2.7) पर मिलता है - एक अपवाद के साथ - अगर मैं AI_ALL
बिना AI_V4MAPPED
निर्दिष्ट करें, और होस्ट नाम मैं ऊपर देखो CNAME उपलब्ध एक रिकॉर्ड की ओर इंगित करता है, मैं ' उन लोगों को वापस नहीं मिला। यह ठीक काम करता है अगर AI_ALL
भी निर्दिष्ट है, या यदि होस्टनाम सीधे एक रिकॉर्ड से जुड़ा हुआ है।
मुझे नहीं पता क्यों - शायद यह एक ग्लिबक बग है?
#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;
}
मैं इस पर बहुत अधिक शोध कर रहा हूं। Getaddrinfo किसी भी संख्या में बग से पीड़ित प्रतीत होता है, आंशिक रूप से क्योंकि इसमें एएएए अनुरोधों के टूटे हैंडलिंग के लिए बहुत सारे अजीब मामले हैं। – Omnifarious
आप उत्तर वास्तविक जवाब के सबसे नज़दीक हैं, इसलिए आपको उत्तर क्रेडिट प्राप्त होता है। – Omnifarious
AI_ALL के बिना AI_V4MAPPED एक glibc बग है http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=503912 – unixman83