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.