我通过3G从iPhone发送UDP数据包时遇到了一个奇怪的问题.几乎每次我的应用程序在较长时间的网络不活动后开始(例如在手机来自睡眠模式或刚刚获得3G连接之后),我的应用程序无法发送任何UDP数据包.我收到kCFSocketError
错误状态CFSocketSendData
.然后,应用程序逻辑会重新尝试每五秒钟定期发送一次数据包,但无论我让它运行多久,它都会一直失败.但是,当我将应用程序切换到后台并打开时,例如,Safari中的网页(当应用程序仍然在后台失败时),应用程序突然开始工作.基本上,似乎其他网络活动(来自Safari,地图等)"开启真正的网络".例如,我是否需要在网络初始化方面做一些特别的事情?
这是我用来发送UDP数据包的代码的简化片段:
CFSocketRef cfSocket = CFSocketCreate(NULL, 0, SOCK_DGRAM, IPPROTO_UDP, kCFSocketNoCallBack, NULL, NULL); if (!cfSocket) { // snip: some error handling } struct sockaddr_in addr; // snip: init addr CFDataRef cfAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr)); CFSocketError sendPacketResult = CFSocketSendData(cfSocket, cfAddr, cfPacketData, 0.0); if (sendPacketResult != kCFSocketSuccess) { // try again in 5 seconds }
一切正常,Wi-Fi没有任何问题.
公平地说,我认为我在标准的iPhone应用程序(Safari,Maps,...)中有时(但偶尔也会)看到相同的行为.有时他们拒绝连接(甚至认为我看到了3G图标),我需要关闭并重新打开它们.但这是非常罕见的.
编辑:可能相关的问题:在iPhone上,EPERM(errno == 1)对UDP数据发送()的响应意味着什么?.