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