如何确定C++中的 IP 版本



我想同时支持IPv4和IPv6版本。现在。我只支持IPv4,但为了为每个版本的IP设置不同的行为,我需要知道我正在使用哪个版本的IP。

目前我正在使用gethostbyname函数,并且根据hostent struct字段h_addrtype我设置它是IPv4还是IPv6,但我想知道这真的正确吗?如果不是,有什么可能的方法可以获取IP版本?如果正确,如果此功能失败,我该怎么办?

提前感谢。

gethostbyname被弃用,你实际上应该使用getaddrinfo,它被弃用的原因之一是IPv4/IPv6问题。

话虽如此,是的,检查h_addrtype是正确的。

IPv6地址的h_addrtype字段应AF_INET6(而不是AF_INET),并且在使用gethostbyname时测试该字段是正确的方法。

但是,您应该考虑在新应用程序中使用 getaddrinfo 而不是gethostbyname

您可以使用getsockname来确定IP版本,

int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

可以采用以下方法,

/* Function to detect family of a socket */
// Return AF_INET or AF_INET6
unsigned short GetSocketFamily(int sockfd)
{
    unsigned short sa[16];  // 32 bytes is enough for sockaddr version for any family
                            // 16 bytes for IPv4 and 28 bytes for IPv6
    socklen_t lth = sizeof(sa);
    getsockname(sockfd, (struct sockaddr *)&sa, &lth);
    return sa[0]; // In any case (IPv4 or IPv6) family is the first halfword of 
                  // address structure
}

最新更新