我想同时支持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, <h);
return sa[0]; // In any case (IPv4 or IPv6) family is the first halfword of
// address structure
}