2016-07-06 10 views
0

Ich versuche Broadcast-UDP-Datagramme auf iOS zu empfangen. Ich fing an, die CocoaAsyncSocket Bibliothek zu benutzen, die ziemlich gut scheint. Ich benutze es wie folgt:Empfangen von UDP-Broadcast-Daten

m_socket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()]; 
[m_socket setIPv6Enabled:NO]; 

NSError* error = nil; 
if (![m_socket enableBroadcast:YES error:&error]) 
    return log_warn(@"Failed to enable broadcast: %@.", error.description); 
if (![m_socket bindToPort:43211 error:&error]) 
    return log_warn(@"Failed to bind to port: %@.", error.description); 
if (![m_socket beginReceiving:&error]) 
    return log_warn(@"Failed to begin receiving."); 

Das Ergebnis ist, dass der Rückruf didReceiveData nicht aufgerufen werden soll. Ich versuchte daher, reguläre Socket-API zu verwenden, und es scheint, dass ich einige Bytes bekommen kann: Ich habe einfach this code verwendet.

Ich bin neugierig, warum der obige CocoaAsyncSocket-Code nicht funktioniert. Ich habe versucht, die beiden Ansätze zu vergleichen, indem ich die Interna von CocoaAsyncSocket lese, aber ich bin immer noch nicht in der Lage zu finden, welcher Unterschied verursacht kein Byte zu kommen. Fehle ich etwas im obigen Code mit CocoaAsyncSocket?

+0

Wird ein Fehler angezeigt? Wie konnte nicht an Port oder etc gebunden werden? – Bharat

+0

Kein Fehler. Nicht im Callback und nicht im zurückgegebenen Wert. –

+0

Sind Sie sicher, dass Sie eine Antwort erhalten? Bitte verwenden Sie WireShark, um zu überprüfen, ob Ihr Paket gesendet wird und Sie eine Antwort erhalten. – Bharat

Antwort

0

Durch Lesen des Codes in CocoaAsyncSocket sehe ich, dass das Mitglied, das den Verweis auf den Delegaten hält, schwach ist. Der Grund, warum kein Callback und kein Fehler empfangen wurde, war daher, dass der Delegat frei war. Das Speichern einer starken Referenz auf das Objekt war ausreichend, um die Daten zu erhalten.