POSIX网络不会激活蜂窝无线电?

时间:2014-07-30 09:07:37

标签: ios iphone sockets networking

我正在阅读Networking Programming Topics:Using Sockets and Socket Streams,有一段告诉我们不要在iOS上使用POSIX套接字API,它说:

  

在iOS中,不建议使用POSIX网络,因为它不会激活   蜂窝无线电或按需VPN。因此,作为一般规则,你   应该将网络代码与任何常见的数据处理分开   功能并使用更高级别的API重写网络代码。

正如文档所述,如果我使用POSIX套接字来完成我的网络工作,那么它就不能激活蜂窝无线电。我认为无论是否我的设备没有连接WIFI,我的应用程序都无法访问互联网,但我通过编写下面的代码来否定它。

在这个例子中,我只使用POSIX socket api并连接到谷歌的DNS服务器,当我的iPhone连接到蜂窝无线电(没有WIFI)时它成功。

int clientSocket = socket(AF_INET, SOCK_STREAM, 0) ;
struct sockaddr_in server_addr ;
bzero(&server_addr, sizeof(server_addr)) ;
server_addr.sin_port = htons(53) ;
server_addr.sin_addr.s_addr = inet_addr("8.8.8.8") ;
server_addr.sin_family = AF_INET ;

int i = connect(clientSocket, (const struct sockaddr *)&server_addr, sizeof(server_addr)) ;
if (i >= 0) {
    NSLog(@"connected") ;
}
close(clientSocket) ;

现在我的问题是意味着什么"激活蜂窝无线电"当系统停用蜂窝无线电时

提前致谢。

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

According to "Quinn the Eskimo", an employee from Apple Developer Relations

从历史上看,BSD套接字无法激活WWAN是一个主要问题 陷阱,这就是为什么文件中充斥着对 它。但是,在现代系统上,WWAN网络几乎是 由各种系统服务固定(最明显的是推 通知)。

他说还有其他原因使用CFSocketStream或其他非POSIX API:

  • BSD套接字没有按名称进行连接的机制,因此您需要手动解析名称(使用getaddrinfo),然后连接到每个返回的地址,直到找到有效的地址为止。
  • 即使要与之通信的服务器仅是IPv4(由于DNS64 / NAT64),您也必须支持IPv6。
  • 为了与DNS64 / NAT64兼容,您不应使用特殊情况的IP地址。如果您有IP地址,请将其呈现为字符串并将其传递给getaddrinfo
  • 您应该实施“快乐的眼球”。
  • 请注意,我要强调的是,“快乐的眼球”不能像Apple的API所使用的内置“按名称命名”机制一样有效。但是,这可能已经足够了。
  • 有关内置的​​“按名称连接”机制在传统的Happy Eyeballs算法之外的功能的信息,请查看RFC 8305
  • 您将不兼容某些功能,例如VPN On Demand。

其中只有最后一个是特定于Apple的;一切都只是您使用古老的BSD套接字API所要付出的代价。