Jan*_*ich 5 sockets iphone udp objective-c
我通过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数据发送()的响应意味着什么?.
小智 4
3G TCP/IP 网络接口可以根据操作系统的意愿被 IOS 关闭,通常是出于省电的原因(如果没有流量通过该接口)。当使用 BSD 套接字时(例如,对于 UDP,因为没有 UDP 苹果网络框架),没有已发布的操作系统调用来确保 3G 网络接口正常运行。但在 Apple 的 CFSocketStream 类内部,存在唤醒接口的私有 Apple 调用。
所以解决方案似乎是向某个地方打开一个CFSocketStream。这将唤醒接口一段时间。只要您每分钟左右通过 CFSocketStream 发送一次数据,连接和网络接口就会保持正常状态。
这并不是那么有吸引力,因为它只是通过副作用起作用。但这似乎是目前唯一的解决方案。
| 归档时间: | 
 | 
| 查看次数: | 2522 次 | 
| 最近记录: |