GCDAsyncUdpSocket wird beim Senden an eine IPv6-Adresse sofort geschlossen

Ich verbinde mich über UDP mit einem Server auf einem anderen Gerät, das von Bonjour angekündigt wird. Wenn sich sowohl das iOS-Gerät, auf dem dieser Code ausgeführt wird, als auch der Server in unserem WLAN-Netzwerk befinden, funktioniert dies einwandfrei, da der Bonjour-Dienst eine 192.168.0.xxx-Adresse auflöst, die unser DHCP-Server ausgibt. Wenn es jedoch über Bluetooth angekündigt wird, wird der Dienst manchmal in 169.254.xxx.xxx (IPv4) aufgelöst. In diesem Fall funktioniert es einwandfrei. Aber manchmal wird es in fe80 :: xxxx: xxxx: xxxx: xxxx (IPv6) aufgelöstudpSocket:didConnectToAddress Rückruf), wird aber sofort geschlossen, wenn ich versuche, Daten zu senden (ich empfange dieudpSocketDidClose:withError Rückruf sofort nach Anruf senden).

- (BOOL) setupConnection: (DNSSDService*) service
{
    NSString *host = [service resolvedHost];
    NSUInteger port = [service resolvedPort];
    NSLog(@"in setupConnection: host %@ port %u",
          host, port);

    self.sock = [[GCDAsyncUdpSocket alloc]initWithDelegate:self 
                delegateQueue:dispatch_get_main_queue() ];
    NSError *err = nil;
    if (![self.sock connectToHost:host onPort:port error:&err]) {
        NSLog(@"we goofed: %@", err);
        return NO;
    }
    return YES;
}

MeineudpSocket:didConnectToAddress Die Methode ruft einen Send auf, und meine anderen Callbacks dienen zu diesem Zeitpunkt nur der Information (NSLog). Dies ist der NSError, an den übergeben wirdudpSocketDidClose:withError:

Error Domain=GCDAsyncUdpSocketErrorDomain Code=4 "Socket closed" UserInfo=0x2630c0 {NSLocalizedDescription=Socket closed}

Weniger als nützlich.

Um dies zu beheben, möchte ich, dass es mit IPv6 funktioniert, anstatt IPv4 zu erzwingen ... IPv4 zu erzwingen, erscheint mir nur fragil.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage