在不知道它们是 IPv4 还是 IPv6 的情况下预创建套接字

pre-creating sockets without knowing whether they are IPv4 or IPv6

我有一些代码可以通过预先创建套接字(通过 socket() BSD API)来工作,然后在知道地址后执行 connect() 等。这适用于 IPv4,但现在我正在重构以支持 IPv6。

问题是,当我执行初始 socket() 时,我似乎需要输入 AF_INET 或 AF_INET6。但是,由于我还不知道地址,所以我不知道哪个地址是正确的。无论如何要创建一个通用套接字,它适用于任何一个?如果我使用 AF_INET6 并且我在 IPv4 网络上,我假设它不会工作是否正确?

一个相关问题 - 尽管我还不知道 IP 地址,但我是否可以检测到我的设备所在的网络:IPv4 或 IPv6?假设有一个网络接口,我想我只能是这些网络中的一个,所以如果我能找到一种方法来检测我的设备所在的网络类型,那么我就可以在创建套接字时做到这一点。

另一种选择是重构以仅在我知道地址时创建套接字,但代码库很大,我想尽可能避免这种情况。

我正在编写在 iOS 上运行的代码,但我不确定这是否适用于此。

你想做的事是不可能的。 socket在创建的时候是和栈协议相关联的,IPV6和IPV4只是栈协议不同而已。

但是,真正的问题是为什么 预先创建套接字?为什么不在需要时创建套接字?

最后但并非最不重要的一点是,您的假设是不正确的。您的设备可以有多个接口 - 一个用于 IPv4,另一个用于 IPv6 - 并同时使用它们。