我正在阅读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) ;
现在我的问题是意味着什么"激活蜂窝无线电"当系统停用蜂窝无线电时?
提前致谢。
答案 0 :(得分:0)
对于C中的TCP网络,Apple似乎建议使用CFStream
。请参阅https://developer.apple.com/library/ios/documentation/NetworkingInternetWeb/Conceptual/NetworkingOverview/CommonPitfalls/CommonPitfalls.html#//apple_ref/doc/uid/CH73-SW4。
答案 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所要付出的代价。