设置1:我创建了一个TCP Sender应用程序和一个TCP Receiver应用程序.
在本次实验中,我在iOS设备上启动了TCP Sender,在另一台iOS设备上启动了TCP Receiver.然后两者都经过验证已建立连接并发送和接收数据.然后我将TCP Receiver应用程序置于后台. TCP Sender应用程序指示连接丢失和崩溃(是的,我打算这样).
设置2:我创建了一个UDP Sender应用程序和一个UDP Receiver应用程序.
与上面相同,我在iOS设备上启动了UDP Sender应用程序,在另一个iOS设备上启动了UDP Receiver应用程序.在UDP Receiver应用程序上,我订阅了一个多播组等.我验证了UDP Receiver应用程序正在从UDP Sender应用程序发出的该多播组中接收数据.然后我将UDP Receiver应用程序置于后台. 2分钟后,我得到UDP Sender应用程序发送另一条数据.然后我完全退出UDP Sender应用程序并关闭该iOS设备.然后我等待另外2分钟或更长时间,然后从后台启动UDP Receiver应用程序. UDP Receiver应用程序确实接收了UDP Sender应用程序终止之前发送的数据.
在setup1中,我的解释是因为TCP是面向连接的.
在setup2中,我理解UDP是无连接的.任何解释为什么setup2在我的经历中起作用? (即使在后台模式下仍然可以接收数据)
解决方法
在您的UDP情况下,内核接收数据包并将其放入内核缓冲区,等待您的应用程序接收它.由于您的应用程序进程存在但有效停止,因此数据将仅位于内核缓冲区中.如果你获得太多数据,它将超出内核缓冲区并被丢弃.否则,您的应用程序可以在(如果)再次安排时收到它.
在TCP案例中,几乎完全相同.
但是(很大但是):操作系统总是可以选择根据内存压力等方式拆除已挂起的应用程序的套接字.因此,虽然它不一定无偿地执行,但它可能会这样做.
我不确定你为什么看到TCP连接快速切断.可能是服务TCP连接的内核启发式比UDP套接字更具攻击性,因为TCP连接需要比UDP套接字更多的状态和更连续的处理.
见Technical Note TN2277 Networking and Multitasking.