我目前正在使用 XCode 5.0 并正在开发一个使用CocoaAyncSocket库的 iOS 7 示例应用程序。在此应用程序中,“发送者控制器”发送 UDP 消息以255.255.255.255
供port 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%……这对我来说似乎相当高。
如果有人对此或任何有用的信息有任何建议/经验,将不胜感激
提前致谢!