我在网络上有一个设备通过 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 *)address
withFilterContext:(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)。