GCDAsyncUdpSocket na iOS brakuje multiemisji datagramów

Mam urządzenie w sieci, które rozsyła multicast bardzo małego pliku przez UDP. Aplikacja iOS, którą tworzę, jest odpowiedzialna za czytanie tych pakietów i zdecydowałem się na ich użycieGCDAsyncUdpSocket zrobić to. Plik jest wysyłany co pół sekundy, ale nie odbieram go prawie tak często (otrzymuję go tylko co 3-10 sekund).

Myśląc, że może to być problem z urządzeniem, zacząłem monitorować ruch za pomocą Wiresharka. Wydawało się to odzwierciedlać to, co widziałem w mojej aplikacji, dopóki nie włączyłem „Monitor Mode” w Wireshark, w którym to momencie każdy pakiet UDP był przechwytywany. Ponadto symulator iOS zaczął otrzymywać wszystkie brakujące pakiety, ponieważ dzieli kartę sieciową z komputerem Mac, na którym pracuję.

Czy istnieje sposób na włączenie „trybu monitorowania” na urządzeniu z systemem iOS lub czymś, czego mi brakuje, aby umożliwić brakujące pakiety? Widzę również, że w GCDAsyncUdpSocket istnieje metoda readStream. Być może muszę użyć tego zamiast beginReceiving? Chociaż nie wiem, jak skonfigurować strumienie w Objective-C, jeśli tak jest.

Oto mój kod testowy, ponieważ jest teraz:

- (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);
    }
}

Rozwiązanie dla każdego, kto przyjdzie tu w przyszłości:

Opierając się na odpowiedzi ilmiacs, udało mi się znacznie zmniejszyć liczbę brakujących pakietów poprzez pingowanie docelowego urządzenia z systemem iOS. Korzystając z komputera Mac, uruchomiłem to w terminalu -

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

Teraz, gdy działa na Macu, który pinguje urządzenie z systemem iOS, przejdę do przykładów pingów iOS firmy Apple i zobaczę, czy mogę pingować urządzenie, aby stymulować własną kartę bezprzewodową (127.0.0.1).

questionAnswers(3)

yourAnswerToTheQuestion