Ho un dispositivo sulla rete che esegue il multicasting di un file molto piccolo tramite UDP. L'app iOS che sto sviluppando è responsabile della lettura di questi pacchetti e ho scelto di utilizzare GCDAsyncUdpSocket per farlo. Il file viene inviato ogni mezzo secondo, tuttavia non lo ricevo quasi spesso (ricevendo solo circa ogni 3-10 secondi).GCDAsyncUdpSocket su iOS mancanti datagrammi multicast
Pensando che potrebbe essere un problema con il dispositivo, ho iniziato a monitorare il traffico con Wireshark. Questo sembrava riflettere ciò che vedevo nella mia app fino a quando non ho abilitato la "Modalità Monitor" in Wireshark, a quel punto ogni pacchetto UDP veniva catturato. Inoltre, il simulatore iOS ha iniziato a ricevere tutti i pacchetti mancanti poiché condivide la NIC con il Mac su cui sto sviluppando.
C'è un modo per abilitare "Modalità Monitor" su un dispositivo iOS o qualcosa che mi manca che consentirebbe ai pacchetti mancanti di entrare? Vedo anche che esiste un metodo readStream in GCDAsyncUdpSocket. Forse ho bisogno di usare questo invece di beginReceiving? Anche se non so come impostare i flussi in Objective-C, se questo è il caso.
Ecco il mio codice di prova come è ora:
- (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);
}
}
soluzione per chi arriva in cerca qui in futuro:
Sulla base di risposta di ilmiacs, ero in grado di ridurre in modo significativo il numero di pacchetti mancanti eseguendo il ping del dispositivo iOS di destinazione. Utilizzando un Mac, ho eseguito questo nel terminale -
sudo ping -i 0.2 -s 4 <Target IP>
Ora che ho in esecuzione con un Mac il ping sul dispositivo iOS, ho intenzione di guardare in esempi ping iOS di Apple e vedere se posso avere il dispositivo ping stesso per stimolare il proprio adattatore wireless (127.0.0.1).
ci si rende conto che i pacchetti UDP sono ** non ** garantiti per la consegna in base alla progettazione? la tua applicazione deve essere in grado di gestire questo caso. –
Sì, so che UDP è inaffidabile, ma potrebbe davvero essere la causa del fatto che molti pacchetti non vengano scoperti? Inoltre, l'app riceve ogni pacchetto senza problemi finché la scheda NIC ha attivato la modalità monitor. – Squatch
@Squatch puoi dire quale dispositivo hai usato? –