2011-01-23 6 views

답변

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 for ipv6 허용 – jcoder

0

당신은 C++ 소켓 라이브러리에으로 gethostbyname() 함수를 사용해야합니다. (here is an example)

IP와 같은 정보를 얻을 수있는 호스트 구조체를 다시 제공합니다.

관련 문제