7

在“网络编程主题概念指南”的“使用套接字和流”一章中,Apple 说:

注意: POSIX 网络不会激活 iOS 上的蜂窝无线电。出于这个原因,在 iOS 中通常不鼓励使用 POSIX 网络 API。

同样在“网络概述指南”的“网络提示和陷阱”一章中,Apple 说:

在 iOS 中,直接使用 POSIX 函数或 CFSocket 使用套接字不会自动激活设备的蜂窝调制解调器或按需 VPN。

好的,所以在 iOS 上既不应该使用 POSIX 套接字也不应该使用 CFSocket,它只是 POSIX 套接字的一个薄包装器,它通过 RunLoops 支持异步网络。没问题。但是,如果您需要UDP Socket,您应该使用什么 API ?

苹果在“网络概述指南”的“网络提示和陷阱”一章中进一步说:

避免在连接到主机之前解析 DNS 名称

因此,理想情况下,应该有一个 API 用于管理 UDP 套接字,而不是 POSIX API 和 CFSocket,它接受 DNS 名称而不是目标地址的 IP 地址。

也许我是盲人,但我找不到任何这样的 API。有任何想法吗?

使用任何第三方 API(不是来自 Apple)并不有趣,因为这样的 API 必须基于任何一个 Apple API,在这种情况下我可以直接使用这个 Apple API。围绕 POSIX 套接字编写我自己的包装 API 是小菜一碟,我之前写过很多套接字包装器,我已经知道所有令人讨厌的陷阱。但是我不会使用 POSIX API,这是这里最初的问题。

4

4 回答 4

2

我问了 Apple 完全相同的问题,他们的回答或多或少是没有任何用于 UDP 套接字的高级接口。不管 Apple 在他们的指南中说什么,在使用 UDP 时,要么直接使用 POSIX 套接字,结合异步管理器,如poll()or select(),要么创建一个 POSIX 套接字(可能根据需要使用bind()和/或connect()在其上),然后将其包装成用于获取 RunLoop 集成的CFSocket对象。CFSocketCreateWithNative()这是现有的最好的 API。所有更高级别的 API 都设计为仅与 TCP 一起使用。

于 2012-12-21T10:05:33.263 回答
1

正在尝试同样的事情,尽管文档说较低级别的 API 不会激活蜂窝无线电和按需 VPN,但事实证明它对于 TCP 连接并不完全正确。

在 UDP 的情况下,这是正确的,并且您的 UDP 数据包大部分时间都不会被发送。要解决此问题,只需使用较低级别的 API 打开 TCP 侦听套接字,这将激活蜂窝无线电或按需 VPN,并在完成后关闭套接字。

对于 TCP,您可以将低级 API 用于 iOS 设备上的服务器端代码,这会激活蜂窝无线电或按需 VPN,但对于 iOS 设备上的客户端代码,最好使用更高级别的 API。假如。无论哪种方式,无线电都处于活动状态,您不必担心没有发送数据包。

顺便说一句,这就是我目前正在做的事情。

于 2014-12-11T07:01:24.790 回答
0

Apple 有一个示例代码描述如何使用 UDP。我自己没有尝试过,但这应该会给你一些很好的指导:

https://developer.apple.com/library/mac/#samplecode/UDPEcho/Introduction/Intro.html

于 2012-12-18T12:01:40.560 回答
0

自 2018 年以来,Apple 推出了NetworkFramework,根据 Apple 的说法,它是一种现代替代方案Sockets,包括用于管理 TCP 和 UDP 连接的高级 API

于 2019-10-28T11:37:59.367 回答