如何检查给定的二进制地址是否为c中的ipv4或ipv6

时间:2017-10-11 13:21:57

标签: c

我想检查给定的地址是ipv6还是ipv4。我的地址将以二进制形式出现(不是字符串格式)。在这种情况下,我如何检查给定的二进制数是ipv4还是ipv6?

1 个答案:

答案 0 :(得分:2)

这取决于你所说的“二进制形式”。

通常,单个原始二进制整数不是网络地址的适当表示。网络地址有很多种。

如果您有32位数字,则可能是IPv4地址。如果您有128位数字,则可能是IPv6地址。如果你有一个大到足以容纳任何一个的整数,意味着你必须根据值做出决定,如果它小于4294967296,那么可能是 IPv4,否则是IPv6。但这些启发式算法都没有得到保证(部分原因是因为除了IPv4和IPv6之外还有其他类型的网络地址)。

几乎所有处理网络地址的API都使用多字段数据结构来简明扼要地描述它们。例如,描述网络地址的一种方法是struct hostent。现在,struct hostent有一个h_length字段,它明确地给出了地址的大小(以字节为单位),因此这是一个开始。但它还有一个h_addrtype字段,它明确告诉您它是AF_INET(IPv4),AF_INET6(IPv6)还是其他一些地址族。所以没有必要猜测或直觉。

我强烈建议您使用像struct hostent这样的数据结构,而不是单个原始二进制整数来携带网络地址。使用原始二进制数是一种让自己陷入IPv4的好方法,现在是时候更难扩展到IPv6了。 (我在这里讲述悲伤的经历。:-()