换句话说,如果地址是IPv4,为什么还要把它表达为IPv6呢?
答案 0 :(得分:21)
它是通过IPv6表示的IPv4,因此应用程序只需要支持一个IP堆栈。
能够通过IPv6表示法引用IPv4地址意味着我可以在我的应用程序中获得非常可靠的IPv6支持,而不必担心重复工作。
目前,某些发行版默认禁用IPv4兼容性(例如Debian),Windows也会默认执行此操作。为了适应这个程序员,您应该绑定两个套接字:一个IPv4套接字和一个带有IPV6_V6ONLY
标志的IPv6套接字(强制它仅绑定IPv6,不兼容IPv4,无论状态为{{1 }})。
在下面的评论中,Mike将我与this great site联系,提供了有关如何使用sockaddr_storage进行AF_独立编程的信息(无论您决定使用AF_INET6还是决定使用AF_INET和AF_INET6,这都具有很大的相关性旁边)。我也喜欢Beej的网络编程指南,它也有some similar information。推荐阅读。谢谢,迈克!
答案 1 :(得分:9)
如果地址是IPv4,为什么还要把它表达为IPv6呢?
转发兼容性?
答案 2 :(得分:6)
将该表单与V4MAPPED地址一起使用是合适的。
V4MAPPED地址不应出现在网络中传输的实际IPv6报头中。它们只应该由使用双栈IPv4 / IPv6主机实现的应用程序使用,其中单个传输端点可以同时使用IPv4和IPv6进行通信。
如果使用IPv6协议族打开TCP连接而不要求端点仅为IPv6 [可能是系统上的默认端口]并且您以V4MAPPED格式指定目标地址,则操作系统将连接IPv4,当您在系统上调用道德等同于getsockname
时,您将获得一个V4MAPPED地址。