iOS上的GCDAsyncUdpSocket缺少多播数据报

iOS上的GCDAsyncUdpSocket缺少多播数据报,第1张

概述我在网络上有一个设备通过UDP组播一个非常小的文件.我正在开发的iOS应用程序负责读取这些数据包,我选择使用 GCDAsyncUdpSocket这样做.该文件每半秒发送一次,但我几乎没有收到它(大约每3-10秒接收一次). 认为这可能是设备的问题,我开始使用Wireshark监控流量.这似乎反映了我在我的应用程序中看到的内容,直到我在Wireshark中启用“监控模式”,此时每个UDP数据包都被捕 我在网络上有一个设备通过UDP组播一个非常小的文件.我正在开发的iOS应用程序负责读取这些数据包,我选择使用 GCDAsyncUdpSocket这样做.该文件每半秒发送一次,但我几乎没有收到它(大约每3-10秒接收一次).

认为这可能是设备的问题,我开始使用Wireshark监控流量.这似乎反映了我在我的应用程序中看到的内容,直到我在Wireshark中启用“监控模式”,此时每个UDP数据包都被捕获.此外,iOS模拟器开始接收所有丢失的数据包,因为它与我正在开发的Mac共享NIC.

有没有办法在iOS设备上启用“监控模式”或者我缺少哪些可以让丢失的数据包进入?我还看到GcdasyncUdpSocket中有一个readStream方法.也许我需要使用它而不是beginReceiving?虽然如果是这样的话,我不知道如何在Objective-C中设置流.

这是我现在的测试代码:

- (voID)vIEwDIDLoad{    [super vIEwDIDLoad];    // Do any additional setup after loading the vIEw,typically from a nib.    NSLog(@"VIEw Loaded");    [self setupSocket];             }- (voID)setupSocket{    udpSocket = [[GcdasyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];    NSError *error = nil;    if (![udpSocket bindtoport:5555 error:&error])    {        NSLog(@"Error binding to port: %@",error);        return;    }    if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){        NSLog(@"Error connecting to multicast group: %@",error);        return;    }    if (![udpSocket beginReceiving:&error])    {        NSLog(@"Error receiving: %@",error);        return;    }    NSLog(@"Socket Ready");}- (voID)udpSocket:(GcdasyncUdpSocket *)sock dIDReceiveData:(NSData *)data      fromAddress:(NSData *)addresswithFilterContext:(ID)filterContext{    Nsstring *msg = [[Nsstring alloc] initWithData:data enCoding:NSUTF8StringEnCoding];    if (msg)    {        NSLog(@"RCV: %@",msg);    }    else    {        Nsstring *host = nil;        uint16_t port = 0;        [GcdasyncUdpSocket getHost:&host port:&port fromAddress:address];        NSLog(@"UnkNown message from : %@:%hu",host,port);    }}

任何来这里寻找未来的人的解决方案:

根据ilmiacs的回答,我能够通过Ping目标iOS设备来显着减少丢失数据包的数量.使用Mac,我在终端运行它 –

sudo Ping -i 0.2 -s 4 <Target IP>

现在我已经使用Mac Ping iOS设备运行了,我将查看Apple的iOS Ping示例,看看我是否可以让设备Ping自己来刺激自己的无线适配器(127.0.0.1).

解决方法 通过我在iOS设备的网络应用程序方面的工作,我发现他们的网络适配器有两种不同的模式,让我们把它们称为主动和被动.我没有找到任何关于此的文档.以下是我的发现:

>只要处于活动模式,适配器就会响应很快.我的响应时间为3-5ms.
>经过一段时间不活动后,iOS的网络适配器从主动模式下降到被动模式.发生这种情况的时间取决于实际的设备型号.第三代iPad大约200ms.对于iPhone 4来说,它更像是50ms.
> Ping请求或TCP数据包会将适配器从被动模式移动到活动模式.这可能需要50毫秒到800毫秒,平均约200毫秒.

通过发出Ping命令可以完全重现此行为.例如.

Ping -i 0.2 <ios-device-ip>

将Ping间隔设置为200ms并使我的iPad网络适配器保持活动状态.

如果适配器(通常情况下)在被动模式下忽略UDP数据包,则此行为与您的观察结果完全一致. wireshark活动可能使其保持活动模式,因此它将获得UDP.

检查Ping技巧是否有帮助.

通过打开和连接设备本身的两个插槽并定期发送自己的数据包,可能可以使IDevice的网络适配器保持活动状态.这会引入一些最小的开销.

至于为什么苹果决定实施这样的功能,我只能推测.但是,保持适配器有效可能需要足够的电池电量来合理这样的设计选择.

希望这可以帮助.

总结

以上是内存溢出为你收集整理的iOS上的GCDAsyncUdpSocket缺少多播数据报全部内容,希望文章能够帮你解决iOS上的GCDAsyncUdpSocket缺少多播数据报所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1100715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存