我想知道确定使用哪种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会怎么样?
是否有一种受制裁的标准方法来确定哪个结构映射到相应的地址族?
答案 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!
}