我应该使用哪种高级API来pipe理iOS上的UDP套接字?
苹果公司在“ networking编程主题概念指南 ”的“ 使用套接字和stream ”一章中说:
注意: POSIXnetworking不会在iOS上激活蜂窝无线电。 出于这个原因,在iOS中通常不鼓励POSIXnetworkingAPI。
另外在“ networking概述指南 ”的“ networking技巧和陷阱 ”一章中,苹果说:
在iOS中,使用直接使用POSIX函数或CFSocket的套接字不会自动激活设备的移动调制解调器或按需VPN。
好吧,所以在iOS上,不应该使用POSIX套接字,也不应该使用CFSocket,它只是通过RunLoops支持asynchronousnetworking的POSIX套接字的薄包装。 没问题。 但是,如果你需要一个UDP套接字 ,你应该使用什么API?
进一步的苹果在“ networking概述指南 ”的“ networking技巧和陷阱 ”一章中说:
连接到主机之前,请避免parsingDNS名称
所以理想情况下,应该有一个用于pipe理UDP套接字的API,除POSIX API和CFSocket之外,它接受DNS名称而不是目标地址的IP地址。
也许我是盲目的,但我无法find任何这样的API。 有任何想法吗?
使用任何第三方API(不是来自Apple)都没有意义,因为这样的API必须基于Apple API,在这种情况下,我可以直接使用这个Apple API。 用POSIX套接字编写我自己的包装API是小菜一碟,以前我写了这么多的套接字包装器,我已经知道所有令人讨厌的陷阱。 然而,我不会使用POSIX API,这是最初的问题。
我问了苹果完全相同的问题,他们的答复或多或less是没有任何UDP套接字的高级接口。 不pipe苹果在他们的指南中如何说,在使用UDP时,要么直接使用POSIX套接字,要么使用poll()
或select()
这样的asynchronouspipe理器,要么创build一个POSIX套接字(也许使用bind()
和/或connect()
根据需要),然后使用CFSocketCreateWithNative()
将其包装到CFSocket
对象中以获得RunLoop集成。 这是存在的最佳API。 所有更高级别的API都只能用于TCP。
苹果有一个示例代码描述如何使用UDP。 自己没有尝试过,但这应该给你一些好的指针:
https://developer.apple.com/library/mac/#samplecode/UDPEcho/Introduction/Intro.html
正在尝试同样的事情,虽然文档说低级别的API不会激活蜂窝无线电和按需VPN,但是对于TCP连接并不完全正确。
在UDP的情况下,这是成立的,你的UDP数据包大部分时间都不会被发送。 为了解决这个问题,只需使用底层API打开一个TCP监听套接字,这将启动蜂窝无线电或按需VPN,并在完成后closures套接字。
对于TCP,您可以在iOS设备上使用底层的API作为服务器端代码,这样可以激活蜂窝无线电或按需VPN,但是对于iOS设备上的客户端代码,最好使用更高级别的API提供。 无论哪种方式,收音机是活跃的,你不必担心没有发送数据包。
顺便说一句,这是我目前正在做的。