iOS 6 и непрерывное получение пакета udp с использованием gcdasyncsocket

У меня проблема с непрерывным получением пакета udp с помощью gcdasyncsocket. Это похоже на то, как iP5 iOS6 и iP4 iOS6 получают пакет в течение 200-300 мс, затем останавливаются еще на 200-300 и начинают получать снова. Я провел тест с iPhone 5 iOS7, iPhone 4 iOS 6 и iPhone 5 iOS6. Результаты подтверждают, что проблема возникает только с iOS 6.

Тесты

Код не является чем-то сложным, он настолько прост, насколько это возможно, отправка на широковещательный адрес "230.0.0.1", а сокет получателя присоединяется к группе "230.0.0.1".

Отправитель

_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
[_udpSocket bindToPort:_port error:&error];
[_udpSocket enableBroadcast:YES error:&error];
-(void)processBuffer: (NSData*)data
{
    [_udpSocket sendData:data toHost:@"230.0.0.1" port:_port withTimeout:-1 tag:tag];
    tag++;
}

Получатель

_udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
if (![_udpSocket bindToPort:_port error:&error])
{
    NSLog(@"Binding to port %i: %@",_port,error);
}

if (![_udpSocket joinMulticastGroup:_address error:&error])
{
    NSLog(@"Joining to multicast groupu: %@",error);
}
if (![_udpSocket beginReceiving:&error])
    {
        [_udpSocket close];

        NSLog(@"Error starting server (recv): %@", error);

    }
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
      fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
    NSLog(@"IGotData");
}

Как я могу постоянно получать? Встречались ли вы с подобной проблемой?

Обновлять

Я запускаю тест с симулятором iP5 iOS7 -> 6.1 и симулятором iOS 6.1 -> iP5 iOS7. В обоих случаях у меня непрерывный прием.

Обновление v2

Я снова запускаю тесты, но теперь с симулятором 6.0, и снова у меня непрерывный прием.


person Błażej    schedule 05.12.2013    source источник


Ответы (1)


GCDAsyncUdpSocket работает асинхронно. Вам нужно использовать запрос синхронизации UDP для достижения желаемого результата.

person Dinesh    schedule 05.12.2013
comment
Хорошо, я не могу использовать GCDAsyncUDPSocket, какой класс я должен использовать для синхронизации UDP? - person Błażej; 06.12.2013