2016-06-01 11 views
0

Ich versuche, einen UDP-Socket zu erstellen und Daten an einen Broadcasting-Port zu senden, so dass ich dieselben auf anderen Geräten im selben WiFi-Netzwerk empfangen kann. Ich berechne die IP-Adresse des Sendeanschlusses wie in der angenommenen Antwort here angegeben.GCDAsyncUDPSocket: Keine Daten empfangen, obwohl es erfolgreich gesendet wurde

Danach habe ich einigen Verbindungscode geschrieben, die als unten:

self.udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue() socketQueue:nil]; 
NSError *error; 
[self.udpSocket enableReusePort:YES error:&error]; 
[self.udpSocket enableBroadcast:YES error:&error]; 

- (IBAction)sendMessageToBroadcastPort:(id)sender { 
[self.udpSocket sendData:[@"Hi" dataUsingEncoding:NSUTF8StringEncoding] toHost:[self getUDPBroadcastAddress] port:5556 withTimeout:-1 tag:1]; 
} 

bekomme ich Erfolg die Daten als Delegatmethode didSendData beim Senden: aufgerufen wird.

Bitte führen Sie mich an, was ich hier vermisse.

Danke!

UPDATE: Cpde für die Daten aus dem Rundfunkempfangsöffnung:

- (void)listenForPackets 
{ 
dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL); 
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dQueue socketQueue:nil]; 
NSError *error = nil; 

if (![udpSocket bindToPort:5556 error:&error]) { 
    NSLog(@"Error binding: %@",error);//not connecting to host 
    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); 
} 
} 

Die Ausstrahlung IP, die ich nach der Berechnung erhalten, ist

192.168.2.255

UPDATE 2::

Das Szenario, dem ich gegenüberstehe, ist wirklich anders und komisch. Das Empfangen funktioniert manchmal und manchmal nicht. Wenn ich zwei Apps installiert habe, wurden keine Daten empfangen. Nur das Senden war erfolgreich. Ich habe die Apps aktiviert und nach einiger Zeit hat die App Daten empfangen. In einigen Fällen hörte es nach einiger Zeit auf zu empfangen oder erhielt ohne irgendein Problem weiter. Was kann das Problem sein?

+0

Sie brauchen nicht zu nennen 'connectToHost' als UDP ist Verbindung weniger. Sie sollten 'sendData: toHost: port: withTimeout' verwenden. – Paulw11

Antwort

0

Ich beantworte diese Frage als das Szenario, das ich konfrontiert war wirklich anders und seltsam. Das Empfangen funktioniert manchmal und manchmal nicht. Wenn ich zwei Apps installiert habe, wurden keine Daten empfangen. Nur das Senden war erfolgreich. Ich habe die Apps aktiviert und nach einiger Zeit hat die App Daten empfangen. In einigen Fällen hörte es nach einiger Zeit auf zu empfangen.

Eigentlich benutzte ich eine gemeinsame Internetverbindung von meinem Mac, die mit Ethernet verbunden ist. Ich habe mein WiFi-Netzwerk in ein richtiges Breitbandnetz umgewandelt und seitdem funktioniert es ohne Probleme.

Hope this jemand mit ähnlichem Szenario hilft :)

1

Versuchen Sie, wie unten:

einen Sockel erstellen:

-(void)createClientUdpSocket 
{ 
    dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL); 

    sendUdpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue: dQueue socketQueue: nil]; 
    [sendUdpSocket receiveOnce:nil]; 
    [sendUdpSocket joinMulticastGroup:[self getIPAddress] error:nil]; // Put your IP Address 
    NSLog(@"Ready"); 
} 

Delegatmethode für Sockel.

-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext 
{ 
    NSString *ip = [GCDAsyncUdpSocket hostFromAddress:address]; 
    uint16_t port = [GCDAsyncUdpSocket portFromAddress:address]; 
    NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
    // Continue to wait for a message to receive the next 
    NSLog (@ "The server receives the response [%@:% d]%@", ip, port, s); 
    [sock receiveOnce:nil]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
    [self sendBackToHost:ip port:port withMessage:s]; 
    }); 
} 

-(void)sendBackToHost:(NSString *)ip port:(uint16_t)port withMessage:(NSString *)s{ 

     [sendUdpSocket sendData:yourData toHost:yourIP port:5556 withTimeout:60 tag:200]; 
     NSLog(@"sent message to server"); 
} 

Hoffe, das wird helfen. Es funktioniert für mich :)

+0

Vielen Dank für Ihre Antwort. Jetzt, da ich den Socket nicht verbinde, bekomme ich den Fehler nicht, aber die Sample-Receiver-App empfängt nichts, wenn ich versuche, den Inhalt der Broadcasting-IP zu lesen. Ich habe meine Frage mit dem Code des Empfängers aktualisiert. Oder gibt es ein Problem mit meiner berechneten IP? Bitte führen. – Yogi

+0

Ich habe meine Frage basierend auf dem, was ich bis jetzt geschafft habe, aktualisiert. Bitte guck dir das an. – Yogi

+0

Jetzt empfangen funktioniert aber mit einem Problem.Bitte überprüfen Sie meine aktualisierte Frage. – Yogi