2010-05-06 3 views
1

다음 코드는 항상 IPv4를 초래할 것이다 그래야, 성공 IPv4 만 (AF_INET) 주소를 포함하는 hostent 구조를 반환하는 gethostbyname(...)gethostbyname은 IPv4 주소가있는 hostent 구조체를 반환하도록 보장됩니까?

에 충실해야한다, 따라서 보장 gethostbyname(...) 기능을인가 호스트 이름을 해결하기위한 getaddrinfo(...)을 사용할 수 없습니다 주소 :

int resolve(const char *name, struct in_addr *addr) { 

    struct hostent *he = gethostbyname(name); 

    if (!he) 
     return 1; 

    memcpy(addr,he->h_addr_list[0],4); 

    return 0; 
} 

답변

2

아니, gethostbyname()는, at least on Linux을 표기 IPV4 (표준 점) 또는 IPV6 반환 (표준 콜론, 혹은 점) 할 수 있습니다. 그 문제를 해결해야합니다. 다양한 구현을 통해 IPV4 만 반환한다고 생각합니다 (예 : PHP).하지만 사용했던 모든 C 플랫폼은 둘 다 반환 할 수 있고 반환 할 수 있습니다.

앱이 IPV4 전용 인 경우 IPV6을 처리하고 있다는 것을 알아내는 것이 그리 어렵지 않고 사용자가 원격 호스트에 연결할 수있는 적절한 인터페이스가없는 경우 오류가 발생합니다. 앱이 두 가지를 모두 지원하더라도 사용자의 게이트웨이는 무엇을 지원합니까?

. 세 개 이상 또는 : .. IPV6이 있습니다. h_length 모든 주소의 길이 인 반면

편집

h_addr, h_addrlist_[0] 동의어입니다.

아마도 귀하의 질문을 제대로 이해하지 못하고 있습니까?

+0

그래서 gethostbyname 뒤의 DNS 확인자가 IPv6 주소를 반환하면 내 응용 프로그램이 실패합니까? – Robert

+0

@ 로버트 - 주관적입니다. 응용 프로그램의 _user_가 IPV6 주소에 연결할 수 있습니까? –

+0

@Tim : 사이트에서 업데이트를 확인하는 프로그램이기 때문에 성공할 수도 있습니다. 하지만 AF_INET6도 받아 들일 수 있다면 얼마나 큰 구조가되어야할까요? – Robert

2

h_addrtype은 h_addr_list에 IPv4 또는 IPv6 또는 다른 유형의 주소가 포함되어 있는지 알려줍니다. 스위치를 사용하여 줄을 바꿀 수 있습니다 : memcpy (addr, he-> h_addr_list [0], 4); memcpy (addr, he-> h_addr_list [0], N); 여기서 N은 주소 유형에 필요한 길이입니다. MSDN 설명서에 따라 h_length는 '각'주소의 길이입니다.

관련 문제