В GCDAsyncUdpSocket на iOS отсутствуют многоадресные дейтаграммы

У меня есть устройство в сети, которое многоадресно передает очень маленький файл через UDP. Приложение iOS, которое я разрабатываю, отвечает за чтение этих пакетов, и я решил использоватьGCDAsyncUdpSocket сделать это. Файл отправляется каждые полсекунды, однако я не получаю его почти так часто (только получаю каждые 3-10 секунд).

Думая, что это может быть проблема с устройством, я начал отслеживать трафик с помощью Wireshark. Похоже, это отражало то, что я видел в своем приложении, пока я не включил «Режим монитора» в Wireshark, после чего каждый пакет UDP перехватывался. Кроме того, симулятор iOS начал получать все отсутствующие пакеты, так как он разделяет NIC с 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, я смог значительно сократить количество пропущенных пакетов, выполнив эхо-запрос целевого устройства iOS. Используя Mac, я запустил это в терминале -

sudo ping -i 0.2 -s 4 <Target IP>

Теперь, когда я запускаю его с Mac, проверяющим связь с устройством iOS, я собираюсь посмотреть примеры Apple ping для iOS и посмотреть, могу ли я заставить устройство проверять себя, чтобы стимулировать собственный беспроводной адаптер (127.0.0.1).

Ответы на вопрос(3)

Ваш ответ на вопрос