2011-01-23 27 views
0

私のC++のlinuxアプリケーションでは、どのようにIPリストをFQDNに反映させることができますか? (静的IPアドレス+ダイナミックIPアドレス)FQDNによるIPリストの取得方法

10倍

答えて

2

ローカルおよび完全修飾ドメイン名のマッピングを取得する間に主な違いはありません。したがって、他のドメイン名と同様にgetaddrinfoを呼び出すことができます。 DNSサーバーは特定のアドレスのみを宣言したり、より大きなリストからいくつかを自由に選ぶことができるため、ドメイン名に関連付けられたすべてのIPアドレスのリストを取得する方法はありません。たとえば、通常google.comは大陸のサーバーにマップされます。ここで

は、それを使用する方法の例です:

#include <stdio.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <string.h> 
#include <arpa/inet.h> 
int main(int argc, char** argv) { 
const char* domain = argc>1 ? argv[1] : "example.com"; 
struct addrinfo *result, *rp, hints; 

memset(&hints, 0, sizeof(hints)); 
hints.ai_socktype = SOCK_STREAM; // TCP 

int tmp = getaddrinfo(domain, NULL, &hints, &result); 
if (tmp != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(tmp)); 
    return 1; 
} 

for (rp = result;rp != NULL;rp = rp->ai_next) { 
    char buf[INET6_ADDRSTRLEN]; 
    switch (rp->ai_family) { 
    case AF_INET:{ 
    struct in_addr* a4 = & ((struct sockaddr_in*) rp->ai_addr)->sin_addr; 
    inet_ntop(rp->ai_family, a4, buf, sizeof(buf)); 
    printf("IPv4: %s\n", buf); 
    break;} 
    case AF_INET6:{ 
    struct in6_addr* a6 = & ((struct sockaddr_in6*) rp->ai_addr)->sin6_addr; 
    inet_ntop(rp->ai_family, a6, buf, sizeof(buf)); 
    printf("IPv6: %s\n", buf); 
    break; 
    }} 
} 

freeaddrinfo(result); 
return 0; 
} 

この意志出力:

IPv6: 2620:0:2d0:200::10 
IPv4: 192.0.32.10 
+0

FQDNのコード例を添付してください:aaa.bbb.com? – gln

+0

@gln一般的なexample.comでは、aaa.bbb.comはちょうど退屈なエラーメッセージを表示するので、 – phihag

+0

+1はipv6を許可することを覚えています – jcoder

0

あなたがC++のソケットライブラリでのgethostbyname()関数を使用する必要があります。 (here is an example

これはIPのような情報を得ることができるhostent構造体を返します。

関連する問題