最近在给程序添加IPv6支持,因此遇到了IPv4与IPv6互操作的问题。
《UNIX网络编程》上提到,只要给Socket绑定IPv6的通配地址,就可以在双栈协议的机器上用一个IPv6套接字同时监听IPv4和IPv6端口:
struct sockaddr_in6 tempAddr;
memset(&tempAddr,0,sizeof(tempAddr));
tempAddr.sin6_port=htons(localPort);
tempAddr.sin6_family = AF_INET6;
tempAddr.sin6_addr = in6addr_any;
ret = bind(s,(sockaddr *)&tempAddr,sizeof(tempAddr));
但是我在测试的时候,却发现IPv4的客户端无法向IPv6服务端发起连接,connect返回结果是10061,即“目标机器积极拒绝”。出现这个错误表明目标机器的端口没有被监听,也就是说实际上IPv6套接字没有在监听IPv4的连接。同时,如果我把服务端和客户端都改成IPv4或者IPv6,两者能够正常通信。
这就跟书上说的不一致了,查了很多资料,发现,微软是这么说的:
“In order to support both IPv4 and IPv6 on Window