2012-01-28 41 views
6

我创建了几个实验恰好TCP和UDP什么(多播)连接:当iOS应用程序确实进入后台

设置1:我创建了一个TCP发送者的应用程序和TCP接收器应用程序。

在这个实验中,我开始iOS设备和另一iOS设备上的TCP接收器上的TCP发送者。然后两者都被验证已经建立连接并发送和接收数据。然后,我将TCP Receiver应用程序置于后台。 TCP Sender应用程序显示连接丢失并崩溃(是的,我是这样想的)。

设置2:我创建了一个UDP发件人的应用程序和一个UDP接收机应用。

同上,我开始iOS设备和另一iOS设备上的UDP接收机应用的UDP发件人应用程序。在订阅了多播组的UDP Receiver应用程序等上,我验证了UDP Receiver应用程序正在从UDP Sender应用程序发出的多播组接收数据。然后我将UDP Receiver应用放到后台。 2分钟后,我得到UDP Sender应用程序发送另一个数据。然后我完全退出UDP Sender应用程序并关闭该iOS设备。然后等待另外2分钟或更长时间,然后从后台调出UDP Receiver应用程序。 UDP Receiver应用程序确实收到了UDP Sender应用程序在终止之前发出的数据。

在Setup1文件,我的解释是,因为TCP是一个面向连接。

在设置2,我明白了UDP是无连接的。任何解释为什么setup2它在我的经验中工作的方式? (仍然会收到即使在后台模式数据)

回答

10

所有这一切,当你把一个应用程序进入后台,然后让它去悬挂的是,它停止得到由内核调度的情况。它不会立即打破任何连接或拆除任何插座(除非你把它强制)。

在你的UDP情况下,内核接收数据包,并把它变成一个内核缓冲区,等待着您的应用程序接收它。由于您的应用程序进程存在但是被有效地停止,数据将仅位于内核缓冲区中。如果数据太多,它会溢出内核缓冲区并丢弃。否则,您的应用程序可以在(如果)再次安排时接收它。

在TCP的情况下,几乎是同样的事情hapens。

但是(很大但是):操作系统总是可以选择根据内存压力等情况拆除挂起应用程序的套接字。所以虽然它不一定会做到这一点,但它可以做到这一点。

我不知道到底为什么你看到迅速切断TCP连接。这可能是因为TCP连接需要比UDP套接字更多的状态和更连续的处理,所以用于服务器TCP连接的内核启发式比UDP套接字更具侵略性。

Technical Note TN2277 Networking and Multitasking

+1

顺便说一句,我假设当你说“背景”你的意思是“暂停”,因为你没有提到试图运行启用背景应用程序(VOIP,音乐等),除非你做一些事情特殊情况下,背景是您的应用的暂时状态,在进入后台后会很快暂停。查看Apple iOS应用程序生命周期文档。 – smparkes 2012-01-28 17:41:05

+0

优秀的解释!我的想法与你的解释是一致的,(+1票)技术文章非常确认。是的,我的意思是暂停而不是背景。仅供参考:我的TCP发送器因为不断向接收器发送数据流而迅速崩溃。 – user523234 2012-01-28 23:03:01

+0

这将使意义:如果您发送的数据的目的地不接收,并与主线程阻塞调用做到这一点,iOS版将看到您的应用程序不响应,并杀死它。 TCP连接可能仍然正常;它有流量控制来管理缓冲区,但是你不允许阻塞主线太久。 – smparkes 2012-01-29 00:23:41

0

我的观点是,因为操作系统的,这不应该发生,如果你试图在Android操作系统,因为内部监督办公室对什么可以在后台工作的限制,什么不能。

从你说的,我认为它是因为TCP需要更多的资源来发送信息。 TCP使用数据流,UDP使用数据块。问题是TCP创建更大的数据包,而UDP使用8 kb的数据块。

相关问题