在iPhone上发送UDP数据包在新的3G连接上失败,但在其他情况下有效

在iPhone上发送UDP数据包在新的3G连接上失败,但在其他情况下有效,iphone,objective-c,sockets,udp,Iphone,Objective C,Sockets,Udp,当通过3G从iPhone发送UDP数据包时,我遇到了一个奇怪的问题。几乎每次我的应用程序在较长一段时间的网络不活动后启动(例如,在手机进入睡眠模式或刚刚获得3G连接后),我的应用程序都无法发送任何UDP数据包。我从CFSocketSendData获得一个kCFSocketError错误状态。然后,应用程序逻辑每隔五秒钟重新尝试周期性地发送数据包,但无论我让它运行多长时间,它总是失败。但是,当我将应用程序切换到后台并打开Safari中的一个网页(应用程序在后台仍然失败)时,应用程序突然开始工作。基

当通过3G从iPhone发送UDP数据包时,我遇到了一个奇怪的问题。几乎每次我的应用程序在较长一段时间的网络不活动后启动(例如,在手机进入睡眠模式或刚刚获得3G连接后),我的应用程序都无法发送任何UDP数据包。我从
CFSocketSendData
获得一个
kCFSocketError
错误状态。然后,应用程序逻辑每隔五秒钟重新尝试周期性地发送数据包,但无论我让它运行多长时间,它总是失败。但是,当我将应用程序切换到后台并打开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图标),我需要关闭并重新打开它们。但这是非常罕见的


编辑:可能相关的问题:。

如果没有流量通过3G TCP/IP网络接口,通常出于省电的原因,操作系统可以随意拆除3G TCP/IP网络接口。当使用BSD套接字(例如,对于UDP,因为没有UDP apple networking framework)时,没有发布用于确保3G网络接口启动的操作系统调用。但在Apple的CFSocketStream类内部,存在唤醒接口的私有Apple调用

因此,解决方案似乎是在某个地方打开一个CFSocketStream。这将在一段时间内唤醒接口。只要您每分钟左右通过CFSocketStream发送一次数据,连接和网络接口就会保持正常

这并不是很吸引人,因为它只会产生副作用。但这似乎是目前唯一的解决办法