当前位置:  开发笔记 > IOS > 正文

在iPhone上发送UDP数据包会因全新的3G连接而失败,但其他方式则无效

如何解决《在iPhone上发送UDP数据包会因全新的3G连接而失败,但其他方式则无效》经验,为你挑选了0个好方法。

我通过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数据发送()的响应意味着什么?.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有