我有一些代码通过预先创建套接字(通过.socket()BSD API)工作,然后在地址知道的时候它将执行connect()等。这适用于IPv4但现在我也在重构以支持IPv6。
问题是,当我执行初始socket()时,我需要放入AF_INET或AF_INET6。但是因为我不知道地址但我不知道哪个是正确的。反正有没有创建一个适用于任何一个的通用套接字?如果我使用AF_INET6并且我在IPv4网络上,我是否正确认为它不起作用?
一个相关问题 - 即使我还不知道IP地址,我是否可以检测到我的设备所处的网络:IPv4还是IPv6?假设有一个网络接口,我想我只能是这些网络中的一个,所以如果我能找到一种方法来检测我的设备所处的网络类型,那么我可以在创建套接字时这样做。
另一个选择是重构只有在我知道地址时才创建套接字,但是有一个很大的代码库,我想尽可能避免这种情况。
我正在编写在iOS上运行的代码,但我不确定这是否与此相关。
答案 0 :(得分:5)
你想做什么是不可能的。创建套接字时,它与堆栈协议相关联,IPV6和IPV4只是不同的堆栈协议。
然而,真正的问题是为什么你预先创建套接字?为什么不在需要时创建套接字?
最后,但并非最不重要,你的假设是不正确的。您的设备可以有多个接口 - 一个用于IPv4,另一个用于IPv6 - 并且同时使用它们。