我目前工作的一个UDP套接字应用程序,我需要建立支持,使IPV4和IPV6连接可以将数据包发送到服务器。
我希望有人可以帮助我,并指出我在正确的方向; 我发现大多数的文件是不完整的。 这也将会是有益的,如果你能指出Winsock和BSD插座之间的任何差别。
提前致谢!
我目前工作的一个UDP套接字应用程序,我需要建立支持,使IPV4和IPV6连接可以将数据包发送到服务器。
我希望有人可以帮助我,并指出我在正确的方向; 我发现大多数的文件是不完整的。 这也将会是有益的,如果你能指出Winsock和BSD插座之间的任何差别。
提前致谢!
最好的方法是创建一个IPv6服务器插口,也可以接受IPv4连接。 要做到这一点,创建一个普通的IPv6套接字, 关闭套接字选项IPV6_V6ONLY
,其绑定到“任何”地址,并开始接收。 IPv4地址将作为IPv6地址,在IPv4映射格式。
跨系统的主要区别在于是否IPV6_V6ONLY
是)可用,和b)打开或关闭默认。 它默认是关闭的在Linux(即允许在没有setsockopt的双栈插座),并已打开大多数其他系统。
此外,在Windows XP的IPv6协议栈不支持该选项。 在这些情况下,您将需要创建两个单独的服务器插槽,并将其放置在选择或为多个线程。
套接字API是由IETF的RFC管辖,应该在所有平台,包括窗口WRT的IPv6一样。
对于IPv4 / IPv6应用它的所有有关getaddrinfo()
和getnameinfo()
getaddrinfo
是一个天才-着眼于DNS,端口名称和客户端的能力来解决的一个永恒的问题:“我可以使用IPv4,IPv6或两者达到一个特定的目的地是哪里?”或者,如果你打算双栈路由和希望它返回IPv4映射的IPv6地址,它会做到这一点。
它提供了一个直接sockaddr *
的结构,可以插入bind()
, recvfrom()
sendto()
和地址家族socket()
......在许多情况下,这意味着没有凌乱sockaddr_in(6)
结构填写和处理。
对于UDP实现,我会小心的设置双栈插座,或者更一般地说,结合所有接口( INADDR_ANY
)。 经典的问题是,当地址未锁定(见bind()
以特定的接口,该系统具有多个接口的请求,响应可能从基于操作系统路由表的率性多个地址的计算机不同的地址中转,混乱的应用协议,特别是与认证要求的任何系统。
对于UDP实现中,这不是一个问题,或TCP,双栈插座可以节省大量的时间,当IPV * -enabling您的系统。 在那里它`不是绝对必要的,因为有部署IPv6的合理平台(老的Linux,BSD,Windows 2003中)不缺栈不能双栈插槽中必须小心,不能在双栈完全依赖。
我一直在玩这个在Windows下,它实际上确实出现了一个安全问题出现,如果你绑定到环回地址,然后将IPv6套接字是正确绑定[:: 1],但对应的IPv4套接字绑定到INADDR_ANY ,所以你的(据说)安全本地唯一的应用程序实际上是暴露给世界。
RFC中真的不指定IPV6_V6ONLY套接字选项的存在,但是,如果它不存在,该RFC是很清楚的是,实施应如同该选项为FALSE。
当选项,我认为它应该默认为false,但传递的理解,BSD和Windows实现默认为TRUE的原因。 有一个奇怪的要求,这是一个安全问题,因为不知情的IPv6程序员可以绑定以为他们只是被绑定到IN6ADDR_ANY仅IPv6和意外接受IPv4连接引起的安全问题。 我认为这是除了奇怪的人希望RFC兼容的实现既牵强和荒谬的。
在Windows的情况下,非compiance通常不会是一个惊喜。 在BSD的情况下,这是不幸的最好的。