2014-04-09 1 views
0

어떤 sockaddr 변형을 사용할 것인지 결정하는 올바른 방법을 알고 싶습니다. Beej's Guide to Network Programming에서어떤 sockaddr 변형을 사용할 것인지 결정하는 올바른 방법은 무엇입니까?

:

if (p->ai_family == AF_INET) { // IPv4 
    struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; 
    addr = &(ipv4->sin_addr); 
    ipver = "IPv4"; 
} else { // IPv6 
    struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; 
    addr = &(ipv6->sin6_addr); 
    ipver = "IPv6"; 
} 

는 여기에서 그는 주소 패밀리가 AF_INET 경우 확인하고 있는지 sockaddr_in을 사용하고 있습니다. 그렇지 않은 경우 그는 을 사용하고 있습니다. 그게 안전하지 않니? IPv6이 아닌 다른 주소 패밀리라면 어떨까요?

어떤 구조가 해당 주소 패밀리에 매핑되는지를 결정하는 기준이 있습니까?

답변

0

AF_INET6에 대해서는 else if을 사용하고 지원되지 않는 주소 패밀리에서는 실패한 경우 else을 사용할 수 있습니다. 나는 당신이 그들을 지원하기위한 실제 요구 사항을 가지고 있지 않다면 다른 가족들에 대한 지원을 시도하는 것을 피할 것입니다. YAGNI 다음에 지원하거나 테스트 할 계획이 없다면 스펙을 코딩하는 것은 현명하지 않습니다.

if (p->ai_family == AF_INET) { // IPv4 
    struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr; 
    addr = &(ipv4->sin_addr); 
    ipver = "IPv4"; 
} else if (p->ai_family == AF_INET6) { // IPv6 
    struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr; 
    addr = &(ipv6->sin6_addr); 
    ipver = "IPv6"; 
} else { 
    // UNSUPPORTED! FAIL! FAIL! 
} 
+0

제 경우에는 익숙하지 않은 주소 군에서도 전화를해야합니다. 이러한 경우에는 데이터를 무시하고 void 포인터로 복사합니다. 왜 처음에는 void 포인터가 아니기 때문에 혼란 스럽지만 그냥 레거시 코드라고 생각합니다. –

+0

또한'sockaddr_storage'를 사용하는 것이 좋습니다. [여기] (http://stackoverflow.com/questions/8835322/api-using-sockaddr-storage) 이유 – Sanketh

관련 문제