我是靠谱客的博主 火星上白羊,最近开发中收集的这篇文章主要介绍c语言中ipv6地址比较大小,ipv6地址处置,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

ipv6地址处理

代码的一部分::::

char host[NI_MAXHOST];

if(family == AF_INET6)

{

if(strcmp(ifa->ifa_name, eth) == 0)

{

s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

if (s != 0)

{

printf("getnameinfo() failed: %sn", gai_strerror(s));

exit(EXIT_FAILURE);

}

printf("%sn", host);

/* 结果是   fe80::20c:29ff:fe6b:2516%eth0  */

/**************************************

gdb 跟踪是-------------------:

(gdb) p host

$1="fe80::20c:29ff:fe6b:2516%eth0000000a000000000000002603542603673771770000(3453773673771770000340713363673771770000X24637736737717700000133133636737717700000000000037717700000000000000000000b3503773773771770000X2633773673771770000000000000000000002", '00' "300, 633363673771770000 340377367377177000000603363673771770000b73363673771770000L'3373673771770000606333636737717700003206533636737717700002035037737737717700003413033736700000000H8336367377177000026001000000000000000000003771770000L'33736737717700000000000000000000360F3773673771770000260M377367377177000027027625236737717700000000000000000000p23771W00000000"...

******************************************************/

/*   unsigned char ip_v6[16];  现在要把 fe80::20c:29ff:fe6b:2516 这部分内容保存在ip_v6这个字符数组里。。   请问这里改怎么处理??????????????  */

}

}

分享到:

更多

------解决方案--------------------

IPv6 addresses are not so predictable, due to the IPv6 address convention that enables the use of a double-colon (::) to represent a series of zeros. As such, the following IPv6 address representations equate to the same IPv6 address:

1040:0:0:0:0:0:0:1

1040::1

so

fe80::20c:29ff:fe6b:2516

fe80:0:0:0:20c:29ff:fe6b:2516

representations equate to the same IPv6 address

so

unsigned char ip_v6[16]={0xfe,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0c,0x29,0xff,0xfe,0x6b,0x25,0x16};//byte order maybe error.

------解决方案--------------------

//IPv6地址表示

//IPv6地址为128位长,但通常写作8组,每组为四个十六进制数的形式。例如:

//FE80:0000:0000:0000:AAAA:0000:00C2:0002 是一个合法的IPv6地址。

//要是嫌这个地址看起来还是太长,这里还有种办法来缩减其长度,叫做零压缩法。

//如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,上述地址就可以写成

//FE80::AAAA:0000:00C2:0002。这里要注意的是只能简化连续的段位的0,其前后的0都要保留,

//比如FE80的最后的这个0,不能被简化。还有这个只能用一次,在上例中的

//AAAA后面的0000就不能再次简化。当然也可以在AAAA后面使用::,这样的话前面的

//12个0就不能压缩了。这个限制的目的是为了能准确还原被压缩的0.不然就无法确定每个::代表了多少个0.

//2001:0DB8:0000:0000:0000:0000:1428:0000

//2001:0DB8:0000:0000:0000::1428:0000

//2001:0DB8:0:0:0:0:1428:0000

//2001:0DB8:0::0:0:1428:0000

//2001:0DB8::1428:0000都是合法的地址,并且他们是等价的。但

//2001:0DB8::1428::是非法的。(因为这样会使得搞不清楚每个压缩中有几个全零的分组)

//同时前导的零可以省略,因此:

//2001:0DB8:02de::0e13等价于2001:DB8:2de::e13

#include 

最后

以上就是火星上白羊为你收集整理的c语言中ipv6地址比较大小,ipv6地址处置的全部内容,希望文章能够帮你解决c语言中ipv6地址比较大小,ipv6地址处置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部