一:IPv4 与 IPv6的互操作性
ipv4 client to ipv6 server : 通过使用ipv4映射的ipv6地址来实现的。
ipv6 client to ipv4 client :
前提条件是:client/ server主机要支持双栈协议:即系统要同时支持ipv4协议,也支持ipv6协议。而且路由器也应该要支持双栈协议才行。
* 地址映射之后,就做为该地址来进行数据的传输。
服务端:accept() recvfrom() 会在内部吧地址转换映射好。内核会吧地址映射好,在这两个函数内部。
客户端:connect() sendto() 用ipv4映射好的ipv6地址传入作为参数,通过之前调用getaddrinfo(),设置好AI_V4MAPPED标志,函数返回的映射。(前提是支持双栈协议)
*除非显示检查这个IPv6地址是不是一个IPv4映射的IPv6地址,IN6_IS_ADDR_V4MAPPED宏,否则它永远也不知道自己是在与一个ipv4客户通信。客户也不知道是在与一个ipv6服务通信。
ipv6地址是无法表示一个ipv4地址的,因为ipv4的范围不够大。ipv4程序是不能指定一个ipv6的地址,他搞不定。只有ipv6的程序才能够变通为ipv4 or ipv6.so,之后的程序最好写成ipv6程序,这样即可以支持ipv4服务,也可以支持ipv6服务。
* ipv6客户可以指定一个ipv4,但是ipv4客户是不能指定一个Ipv6地址,即使他是双栈主机。
* 设置了IPV6_V6ONLY,那么表示它只接收ipv6对端信息。 如果没有设置,则表示ipv4,ipv6都接收。
*我的理解:
*只有ipv6的程序,不管是服务端还是客户端,他都是可以根据对端ip来判断他是否要转换成对应的ip;
然而ipv4的程序(即使他支持双栈),不管是服务端还是客户端,他都木有能力去转换成ipv6的格式,即使他支持双栈。
ipv6支持隐射,
ipv4不支持映射。
二。IPv6地址测试宏: <netinet/in.h>
#include <netinet/in.h> 由于有些程序是需要清楚对方的ip协议是ipv4还是ipv6,比如ftp的指令格式因4/6而不同。所以需要做不同处理。
int IN6_IS_ADDR_UNSPECIFIED(const struct in6_addr *aptr);
int _LOOPBACK
_MULTICAST
_LINKLOCAL
_SITELOCAL
_V4MAPPED ipv6客户能够调用此来测试由解析器返回的ipv6地址。,可以判断对端是否在使用ipv4.
_V4COMPAT
以上前7个宏测试ipv6地址的基本类型。
以下5个宏测试ipv6多播地址的范围
_MC_NODELOCAL
_LINKLOCAL
_SITELOCAL
_ORGLOCAL
_GLOBAL
三:
应该尽量使用ipv6,因为他支持ipv6也支持ipv4.
================
ipv4改成ipv6,对于简单的程序,差不多只需要改改 :
AF_INET6协议域,和地址结构struct sockaddr_in6 servaddr; servaddr.sin6_family , servaddr.sin6_port serveaddr.sin6_addr.