如何在c中检查给定的二进制地址是ipv4还是ipv6

如何在c中检查给定的二进制地址是ipv4还是ipv6,c,C,我想检查给定的地址是ipv6还是ipv4。我的地址将以二进制形式出现(不是字符串格式)。在这种情况下,如何检查给定的二进制数是ipv4还是ipv6?这取决于您所说的“二进制形式”是什么意思 通常,单个原始二进制整数不是网络地址的合适表示形式。网络地址有很多种 如果您有一个32位的数字,它可能是一个IPv4地址。如果您有一个128位的数字,它可能是一个IPv6地址。如果您有一个足够大的整数,可以容纳其中任何一个,这意味着您必须根据值进行确定,如果它小于4294967296,则可能是IPv4,否则是

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

这取决于您所说的“二进制形式”是什么意思

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

如果您有一个32位的数字,它可能是一个IPv4地址。如果您有一个128位的数字,它可能是一个IPv6地址。如果您有一个足够大的整数,可以容纳其中任何一个,这意味着您必须根据值进行确定,如果它小于4294967296,则可能是IPv4,否则是IPv6。但这些试探法都不能保证(部分原因是除了IPv4和IPv6之外,还有其他类型的网络地址)

实际上,所有处理网络地址的API都使用多字段数据结构来简洁明确地描述它们。例如,描述网络地址的一种方法是
struct hostent
。现在,
struct hostent
有一个
h_length
字段,它明确给出了地址的大小(以字节为单位),因此这是一个开始。但是它还有一个
h\u addrtype
字段,它明确地告诉您它是
AF\u INET
(IPv4)、
AF\u INET6
(IPv6)还是其他地址族。所以不需要猜测或凭直觉


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

这取决于你所说的“二进制形式”是什么意思

一般来说,单个原始二进制整数并不是网络地址的合适表示形式。网络地址有多种形式

如果您有一个32位的数字,它可能是一个IPv4地址。如果您有一个128位的数字,它可能是一个IPv6地址。如果您有一个足够大的整数来容纳其中任何一个,这意味着您必须根据值来确定,如果它小于4294967296,它可能是IPv4,否则是IPv6。但这些启发式方法都不是guaranteed(部分原因是除了IPv4和IPv6之外还有其他类型的网络地址)

实际上,所有处理网络地址的API都使用多字段数据结构来简洁明确地描述它们。例如,描述网络地址的一种方法是
struct-hostent
。现在,
struct-hostent
有一个
h_-length
字段,该字段明确给出地址的大小(以字节为单位),这是一个开始。但它还有一个
h\u addrtype
字段,它明确地告诉您它是
AF\u INET
(IPv4)、
AF\u INET6
(IPv6)还是其他地址族。因此,无需猜测或直觉


我强烈建议您使用像
struct hostent
这样的数据结构,而不是单个原始二进制整数来承载网络地址。使用原始二进制数是将自己锁定在IPv4中的一个很好的方法,现在是时候扩展到IPv6了。(我是根据这里的悲惨经历说的。:-()

当然可以。一个是32位长,另一个是128位长。如果你不知道地址的长度,你就不知道地址的类型……但是如果你还不知道地址的实际长度,你就无法确定地址的实际长度,不管是通过存储地址的对象的类型还是随附的元数据。我投票结束这个问题s不合主题,因为Stackoverflow不是“给我代码”网站。该问题表明根本没有努力解决该问题。这不是guid问题:(当然可以。一个是32位长,另一个是128位长。如果你不知道地址的长度,你就不知道地址的类型……但是如果你还不知道地址的实际长度,你就无法确定地址的实际长度,不管是存储地址的对象的类型还是附带的元数据。我投票以o结束这个问题ff主题,因为Stackoverflow不是“给我代码”站点。该问题表明根本没有解决该问题的努力。这不是guid问题:(