我目前正在使用XCode 5.0并使用{7}}库的iOS 7示例应用程序。在此应用程序中,“发送方控制器”在255.255.255.255
上port 4000
发送UDP消息,以便“接收器控制器”处理和打印输出。 “发送者控制器”具有用于循环消息200次的for循环。使用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%......这对我来说似乎相当高。
如果有人对此信息或任何有用信息有任何建议/经验,我们将不胜感激
提前致谢!