IPv6地址结构的详细探究( 五 )


4) 关于ipv6的几个点简介
① PfcNtop 和 PfcPton
PFC模块提供的PfcNtop、 PfcPton封装了inet_ntop和 inet_pton的功能,主要用来做ip地址和其字符串表示形式的转换 。
② 结构体PFC_IPADDR
typedef struct PROTO_API tagPFC_IPADDR
{
PFC_TRANSPORT_TYPE m_emType; ///< transport type
PFC_IPADDR_UNION m_tAddr; ///< IP address
u16 m_wPort; ///< port number, host format
PFC_DISTRIBUTION_TYPE m_emDistribution;
}
协议组件提供的用来表示ipv4 or ipv6的结构体 。
m_emType指示是ipv4还是ipv6,默认值是无效值none 。
m_tAddr是union类型,表示ipv4 oripv6的具体ip地址 。其中ipv6的具体表示如下:
/// PFC IPv6 address
typedef struct
{
u8 m_abyIP[PFC_IPV6_ADDR_SIZE]; ///< 16 byte IP address
u16 m_wScopeId; ///< scope
} PFC_IPADDRv6;
PFC_IPV6_ADDR_SIZE 为16个字节的宏 。所以ipv6地址使用16个字节的u8数组表示 。m_wScopeId主要是给链路本地地址使用,因为链路本地地址在一个链路上唯一,而一个主机可以使用相同的链路本地地址接入两个不同的链路,那么就要用scopeid来区分 。此字段对应sockaddr_in6结构体里的uint32_t sin6_scope_id 。经测试,如果系统只有一个链路本地地址,win7、win10不用填此字段对通链路上的机器也没有问题,但是和xp系统的对通就有问题 。
③ getaddrinfo函数
获取ip地址,gethostbyname和gethostbyaddr这两个函数仅仅支持IPv4,getaddrinfo可以支持ipv4和ipv6,返回的是一个sockaddr结构的链表而不是一个地址清单 。这个方法,协议组件暂未提供封装,有需求自己欢快使用吧 。
最后IPv6涉及的东西特别多,有些概念上的东西有时很不容易理解,必须查资料啊查资料然后理解它们 。本篇只根据rfc4291 介绍了IPv6的部分内容,以后还需要查阅更多的资料IPv6的其他方面的内容 。




推荐阅读