【发布时间】:2016-05-11 20:35:22
【问题描述】:
我有一些代码可以通过预先创建套接字来工作(通过。socket() BSD API),然后在以后知道地址时它会执行 connect() 等。这适用于 IPv4,但现在我也在重构以支持 IPv6。
问题在于,当我执行初始 socket() 时,我似乎需要放入 AF_INET 或 AF_INET6。但是,由于我不知道地址,但我不知道哪个是正确的。无论如何要创建一个适用于任何一个的通用套接字?如果我使用 AF_INET6 并且我在 IPv4 网络上,我是否正确地假设它不起作用?
一个相关问题 - 即使我还不知道 IP 地址,我是否可以检测到我的设备所在的网络:IPv4 还是 IPv6?假设一个网络接口,我想我只能是其中一个网络,所以如果我能找到一种方法来检测我的设备在什么类型的网络上,那么我可以在创建套接字时做到这一点。
另一种选择是仅在我知道地址时重构以创建套接字,但代码库很大,如果可能,我想避免这种情况。
我正在编写在 iOS 上运行的代码,但我不确定这是否相关。
【问题讨论】:
-
某些平台支持 双栈 套接字(遗憾的是,iOS 不是其中之一,尤其是在 Apple 推动 iOS 仅支持 IPv6 的情况下)。如果可用,您可以为 IPv6 创建一个
AF_INET6套接字,然后禁用其上的IPV6_V6ONLY选项以通过 IPv4-mapped IPv6 addresses 允许 IPv4。