2017-11-04 6 views
0

を設定されていないAI_PASSIVEにもかかわらず、ワイルドカードアドレスを返す...はgetaddrinfo())(getaddrinfoはのmanページから

hints.ai_flagsにAI_PASSIVEフラグが設定されていない場合、 はソケットアドレスを返しますconnect(2)、 sendto(2)、またはsendmsg(2)での使用に適しています。

しかし、一部のウェブサイトでは0.0.0.0が返されています。ワイルドカードアドレスを取得してはいけませんか?

void checkAddresses(char * addrName) 
{ 
    struct addrinfo hints; 
    struct addrinfo * infoptr = 0; 
    struct addrinfo * node = 0; 
    int gai_return = 0; 
    int socket_fd = 0; 
    int gni_return = 0; 
    char host_buffer[255] = { 0 }; 
    struct sockaddr_in * h = 0; 

    memset(host_buffer, 0, sizeof(host_buffer)); 

    memset(&hints, 0, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_DGRAM; 
    hints.ai_flags = 0; 
    hints.ai_protocol = 0; 
    hints.ai_canonname = NULL; 
    hints.ai_addr = NULL; 
    hints.ai_next = NULL; 

    gai_return = getaddrinfo(addrName, 0, &hints, &infoptr); 
    if(gai_return != 0) 
    { 
     perror("Getaddrinfo() failure"); 
     exit(1); 
    } 

    for (node = infoptr; node != NULL; node = node->ai_next) 
    { 
     h = (struct sockaddr_in *) node->ai_addr; 
     strcpy(host_buffer, inet_ntoa(h->sin_addr)); 
     puts(host_buffer); 
    } 

    freeaddrinfo(infoptr); 
} 

答えて

1

AF_UNSPECは、指定されていないアドレスファミリを指定しました。 これはAF_INETAF_INET6の両方を取得することを意味します。あなたがほしいと思うのがAF_INETなら、そう言いなさい。あなたがlocalhostを探している場合は特に、あなたがIPv4アドレスとして最初の4つのバイトを再解釈した場合、IPv6アドレス::1あなたはキャスト場合はどうなると(今バイナリ表現

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 

を持つことになります

お知らせstruct sockaddr_in *へのポインタ)...あなたはnode->ai_familyをチェックする必要がありますAF_UNSPEC


。 IPv4ソケットの場合はAF_INET、IPv6の場合はAF_INET6となる可能性があります。

しかし、ほとんどの場合、アドレスを一切検査する必要はありません。必要はありません。代わりに、恒例のstruct sockaddr *ai_addrsendto(UDPソケット用)にそのまま渡すだけです。

+0

ああ、意味があります。私は 'sockaddr_in'と' inet_ntoa'がIPv4固有のものであるとは思っていませんでした。私はループ時に区別する方法を考えなければなりません。また、ループを2回繰り返すこともできます(AF_UNSPECを使わず、代わりにIPv4とIPv5を指定しました)。ありがとう。 –

関連する問題