In GCDAsyncUdpSocket unter iOS fehlen multicasted Datagramme

Ich habe ein Gerät im Netzwerk, das eine sehr kleine Datei über UDP multicastet. Die iOS-App, die ich entwickle, ist für das Lesen dieser Pakete verantwortlich und ich habe mich für die Verwendung entschiedenGCDAsyncUdpSocket um das zu tun. Die Datei wird jede halbe Sekunde gesendet, aber ich erhalte sie fast nicht so oft (erhalte nur etwa alle 3-10 Sekunden).

Da ich dachte, dass dies ein Problem mit dem Gerät sein könnte, begann ich, den Datenverkehr mit Wireshark zu überwachen. Dies schien das zu reflektieren, was ich in meiner App sah, bis ich den "Monitor Mode" in Wireshark aktivierte, zu welchem ​​Zeitpunkt jedes UDP-Paket erfasst wurde. Darüber hinaus hat der iOS-Simulator begonnen, alle fehlenden Pakete zu empfangen, da er die Netzwerkkarte mit dem Mac teilt, auf dem ich entwickle.

Gibt es eine Möglichkeit, den "Monitor-Modus" auf einem iOS-Gerät zu aktivieren oder etwas, das mir fehlt, damit die fehlenden Pakete eingehen können? Ich sehe auch, dass es eine readStream-Methode in GCDAsyncUdpSocket gibt. Vielleicht muss ich dies anstelle von beginReceiving verwenden? Allerdings weiß ich nicht, wie ich Streams in Objective-C einrichten soll, wenn dies der Fall ist.

Hier ist mein Testcode wie er jetzt ist:

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

Lösung für alle, die in Zukunft hierher kommen:

Basierend auf der Antwort von ilmiacs konnte ich die Anzahl der fehlenden Pakete durch Pingen des iOS-Zielgeräts erheblich reduzieren. Mit einem Mac habe ich dies im Terminal ausgeführt -

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

Jetzt, da ich es mit einem Mac habe, der das iOS-Gerät anpingt, schaue ich in Apples iOS-Ping-Beispielen nach, ob das Gerät selbst anpingt, um seinen eigenen WLAN-Adapter (127.0.0.1) zu stimulieren.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage