10.1 概述
本章中假定所有的主机上都运行着双重协议栈(dual stacks)。
10.2. IPv4客户和IPv6服务器
拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射的IPv6地址实现的。
在一个双重协议栈的主机上,根据接收套接口的类型(TCP或UDP),对一个收到的IPv4或IPv6数据报进行处理的流程:
10.3. IPv6客户与IPv4服务器
客户与服务的组合情况总结
10.4. IPv6地址测试宏
有一小部分IPv6应用程序必须知道与其通信的对方是否使用IPv4协议,这些应用程序需要知道对方的地址是不是一个IPv4映射的IPv6地址。为测试IPv6地址的某些特性共定义了12个宏:
#include <netinet/in.h>
int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr * aptr);
int IN6_IS_ADDR_LOOPBACK(const struct in6_addr * aptr);
int IN6_IS_ADDR_MULTICAST(const struct in6_addr * aptr);
int IN6_IS_ADDR_LINKLOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_SITELOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_V4MAPPED(const struct in6_addr * aptr);
int IN6_IS_ADDR_V4COMPAT(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_NODELOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_LINKLOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_SITELOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_ORGLOCAL(const struct in6_addr * aptr);
int IN6_IS_ADDR_MC_GLOBAL(const struct in6_addr * aptr);
//返回值:非零表示IPv6地址是指定类型的,否则返回零
10.5. IPV6_ADDRFORM套接口选项
IPV6_ADDRFORM套接口选项能把一个套接口从一种类型转变成另一中类型,它受到以下限制:
1. 一个IPv4套接口总能转变为IPv6套接口。所有与该套接口关联的IPv4地址被转换成IPv4映射的IPv6地址。
2. 一个IPv6套接口只有在与之关联的地址是IPv4映射的IPv6地址的情况下才能转变成IPv4套接口。
10.6. 源代码可移植性
10.7. 小结