我有一个多播通过UDP一个非常小的文件在网络上的设备。 在iOS应用我开发负责读取这些数据包,我选择了使用GCDAsyncUdpSocket这样做。 该文件被发送的每半秒,不过我没有收到它几乎经常(仅接受大约每3-10秒)。
认为它可能是设备的问题,我就开始监控与Wireshark的交通。 这似乎反映了我在我的应用程序中看到,直到我启用了“监控模式”在Wireshark的,在这一点每一个UDP数据包被捕获。 此外,iPhone模拟器开始接受所有丢失的数据包,因为它与分享我正在开发Mac上网卡。
有没有一种方法,使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查验iOS设备上运行,我会寻找到苹果的iOS平的例子,看看我能有设备本身的ping来刺激自己的无线适配器(127.0.0.1)。