2

我目前正在使用 XCode 5.0 并正在开发一个使用CocoaAyncSocket库的 iOS 7 示例应用程序。在此应用程序中,“发送者控制器”发送 UDP 消息以255.255.255.255port 4000“接收者控制器”处理并打印出来。“发送者控制器”有一个 for 循环,可以广播 200 次消息。使用 Wireshark(过滤udp.port == 4000),在 200 个数据包中,有 0 个数据包丢失,太棒了!在这种环境下,一切正常,“接收控制器”打印出所有消息。

但是现在当我将应用程序移动到实际的 iPad(iPad MD328LL/A 16GB,Wi-Fi 第三代 iOS 7)时,一些数据包丢失了。在这 200 个数据包中,大约 60% - 65% 的数据包被 WireShark 拾取并送到“接收控制器”。我不太确定它是库(我不认为,因为它与模拟器完美配合)还是导致数据包丢失问题的 iOS 7/iPad。

代码:

// Sender Controller

@interface ViewController ()
{
    GCDAsyncUdpSocket *udpSocket;
}
@end


- (void)viewDidLoad
{
    [super viewDidLoad];

    if (udpSocket == nil)
    {
        [self setupSocket];
    }
    // ...
}

// set ups socket
- (void)setupSocket
{   
    // Initialize
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    // Enable Broadcast
    [udpSocket enableBroadcast:YES error:nil];

    NSError *error = nil;

    // Bind to port
    if (![udpSocket bindToPort:0 error:&error])
    {
        [self logError:FORMAT(@"Error binding: %@", error)];
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        [self logError:FORMAT(@"Error receiving: %@", error)];
        return;
    }

    [self logInfo:@"Ready"];
}

// ...


// Click event
- (IBAction)send:(id)sender
{
    // Format message
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];

    // Broadcast message 200 times
    for (int i = 0 ; i < 200; i++) {
        [udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:0];
    }
}

我知道在这种情况下,这些消息正在以很快的速度发送,用户不太可能发送 200 个这样的广播。我也知道 UDP 很便宜,并且偶尔会出现格式错误或丢失数据包的可能性,但发生率为 40%……这对我来说似乎相当高。

如果有人对此或任何有用的信息有任何建议/经验,将不胜感激

提前致谢!

4

0 回答 0