2014-04-24 2 views
2

IPAddress 66.249.68.9 ("dig -x"는 올바르게 "crawl-66-249-68-9.googlebot.com"라고 표시 함) my lovely 프로그램이 ip68-9-0-0.ri.ri.cox.net이라고 주장하고 있습니다.getnameinfo() - 역방향 DNS 조회 (IP 주소를 호스트 이름으로) C/C++

아래 코드와 비슷한 방식으로 작성하면 마음에 들지 않습니다. IPV4 IP 주소로 시작하고 호스트 이름으로 바꿀 수 있기를 바랍니다.

보너스 질문, 서비스는 무엇입니까? 나는 그것을 필요로하지 않을 것이라고 생각하고, getnameinfo NULL을 줄 것이다. 그러나이 프로그램은 serviceBuffer에 대해 "17145"를 출력하고 있습니다.

#include <string> 
#include <iostream> 
using namespace std; 

#include <netdb.h> // struct sockaddr, AF_INET, NI_NAMEREQD, getnameinfo 
#include <string.h> // memset 
#include <arpa/inet.h> // inet_pton 

int main() { 
    const string IPAddress { "66.249.68.9" }; 

    struct sockaddr structSockAddr; 
    memset(&structSockAddr, 0, sizeof(structSockAddr)); 

    structSockAddr.sa_family = AF_INET; 
    int inetPtonReturnValue { inet_pton(AF_INET, IPAddress.c_str(), &structSockAddr.sa_data) }; 
    if(1 != inetPtonReturnValue) { 
     cout << "inetPtonReturnValue : " << inetPtonReturnValue << endl; // 0 = src doesn't contain valid address, -1 = af isn't a valid family 
    } 

    char hostBuffer[10000]; 
    char serviceBuffer[1000]; 

    int getNameInfoReturnValue { getnameinfo(&structSockAddr, sizeof(structSockAddr), hostBuffer, sizeof(hostBuffer), serviceBuffer, sizeof(serviceBuffer), NI_NAMEREQD) }; 

    if(0 != getNameInfoReturnValue) { 
     cout << "getNameInfoReturnValue : " << getNameInfoReturnValue << endl 
      << "gai_strerror() : " << gai_strerror(getNameInfoReturnValue) << endl; 
    } else { 
     cout << "IPAddress : " << IPAddress << endl 
      << "hostBuffer : " << hostBuffer << endl 
      << "serviceBuffer : " << serviceBuffer << endl; 
    } 
} 
+1

'inetPtonReturnValue {inet_pton (AF_INET, IPAddress.c_str(), structSockAddr.sa_data)}';'inet_pton'을'inetPtonReturnValue'에 실제로 할당하는 이유가 스타일 포인트입니까? – Joe

+0

실제 ("보너스"가 아닌) 질문은 무엇입니까? –

+0

Joe - 중괄호 초기화를 선호합니다. – user1902689

답변

1

inet_pton를 호출 할 때 당신은 struct sockaddr를 사용하고 있지만, 호출 서명이 중 하나 (IPv6에 대한 또는 struct in6_addr)는 AF_INET에 대한 struct in_addr입니다해야합니다. 그리고 나서 나중에 기능을 위해 struct sockaddr을 구축 할 때이를 사용해야합니다.

현재 IP 주소가 들어있는 필드 앞에있는 필드의 일부 바이트를 쓰고 있으므로 sockaddr 필드에 IP의 마지막 2 옥텟으로 끝납니다.

+0

당신은 그것을 못 박았습니다. 감사! – user1902689

관련 문제