确定使用哪个sockaddr变体的正确方法是什么?

时间:2014-04-09 11:59:20

标签: c sockets networking

我想知道确定使用哪种sockaddr变种的正确方法。

来自Beej's Guide to Network Programming

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(如果是)。如果不是,他正在使用sockaddr_in6。这不安全吗?如果是其他地址族不是IPv6会怎么样?

是否有一种受制裁的标准方法来确定哪个结构映射到相应的地址族?

1 个答案:

答案 0 :(得分:0)

为安全起见,您可以使用else if表示AF_INET6,最后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!
}