- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
兼容IPv4与IPv6的Winsock网络编程研究
0 引 言
随着通信技术和网络技术的飞速发展,特别是近年来,IPv4协议面临着一些难以解决的问题,如地址短缺、缺乏服务质量控制Qos和安全性差等。为了应对这一挑战,IETF(Internet Engineer Task Force)组织提出了为适应未来对于网络基础设施数量和质量需求而设计的下一代互联网协议IPv6。IPv6继承了IPv4的优点,并根据IPv4多年来运行的经验进行了大幅度的修改和功能扩充,其扩展性、路由、安全性、配置和可靠性都有明显改进。
l IPv6相对于IPv4 WinSock的改变
1.1 IPv6中新增加的常量
为了支持IPv6,需要定义一个新的地址族名,以便正确地识别和解析IPv6的地址结构。同样,还需要定义一个新的协议簇名(与地址族名具有相同的值),这样就可以使用合适的协议创建一个套接字。新定义的IPv6地址簇名和协议簇名常量为:AF_INET6和PF_INET6。
1.2 IPV6中新增加的地址结构
IPv6的地址结构通过struct in6_addr和structockaddr_in6定义,结构定义分别如下:
1.3 IPV6中新增加的域名解析函数
IPv6引入了名为getaddrinfo()和getnameinfo()的新的API。这两个API是与协议无关的,且既可用于IPv4,也可用于IPv6的名称解析。getaddrinfo()函数的返回值是addrinfo的结构指针。
getaddrinfo()函数可以把主机名或服务名转换成一组socket地址。hints相当于一个过滤器,只有符合hints结构的内容才会返回到res指针中。执行成功后,参数res以链表的形式返回解析出来的地址,可以将这些地址直接传递给bind(),connect(),sendto()等函数。
地址到名称的转换可以通过另一个新的套接字函数getnamein{o()进行。getnameinfo()函数的功能与getaddrinfo()函数相反,该函数接受已经初始化的套接字结构,并返回与地址及端口信息对应的主机和服务.
2 兼容IPv4与IPv6的WinSock网络编程规则
2.1 使用sockaddr_storage结构
sockaddr_storage结构是新的套接字结构,它与协议无关,并拥有充分的地址空间容纳IPv4或者IPv6地址信息,且可以很方便地转换成sockaddr_in结构和sockaddr_in6结构。同时,这个结构还具有针对64位对齐问题的填充项,使用这个结构可以很容易地写出与地址协议簇无关和跨平台的程序代码,因此编写兼容IPv4与IPv6的网络程序时要使用这个结构表示网络地址。
2.2 使用新的名称解析函数getaddrinfo()和getnam-einfo()
这两个函数是随IPv6引进的新的名称解析函数,与地址协议簇无关,隐藏了名字到地址转换和地址到名字转换的大量细节,既能够处理IPv6地址,也能处理IPv4地址。它们也替代性地实现了下列函数接口的功能:gethostbyname(),gethostbyaddr(),inet_ntoa(),inet_aton(),getservbyname(),getservbyport()。可以在简化程序的同时实现与地址协议簇无关的编程,还可以提高程序的可移植性。
3 IPv4与IPv6双协议试验平台的搭建
由于大部分用户的操作系统都是Windows XP,所以在此仅介绍Windows XP下IPv6的安装与配置。
Windows XP操作系统内置了IPv6协议栈,提供了一组命令行方式的IPv6检测配置工具。在XP下安装IPv6协议后,对原IPv4协议的使用不产生任何影响,整个网络上各终端设备能够在一个物理网络上共享IPv4和IPv6协议,并支持2种协议的数据传输,即:所谓的双栈(DualStack)共享。
安装IPv6协议和配置地址及默认网关的过程如下:
来源:维库开发网