GCDAsyncUdpSocket natychmiast zamyka się podczas wysyłania na adres IPv6
Łączę się przez UDP z serwerem na innym urządzeniu, które jest reklamowane przez Bonjour. Gdy zarówno urządzenie z systemem iOS, na którym działa ten kod, jak i serwer, działają w naszej sieci Wi-Fi, działa to dobrze, ponieważ usługa bonjour jest rozpoznawana na adres 192.168.0.xxx, który przekazuje nasz serwer dhcp. Jednak, gdy jest reklamowany przez bluetooth, czasami usługa rozwiązuje się do 169.254.xxx.xxx (IPv4), w którym to przypadku działa dobrze. Ale czasami rozwiązuje to do fe80 :: xxxx: xxxx: xxxx: xxxx (IPv6), w którym to przypadku gniazdo się łączy (otrzymujęudpSocket:didConnectToAddress
callback), ale natychmiast zamyka się, gdy próbuję wysłać dane (otrzymujęudpSocketDidClose:withError
oddzwanianie natychmiast po wysłaniu połączenia).
- (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;
}
MójudpSocket:didConnectToAddress
metoda wywołuje wysyłanie, a moje inne wywołania zwrotne są w tym momencie tylko informacyjne (NSLog). To jest NSError przekazany doudpSocketDidClose:withError
:
Error Domain=GCDAsyncUdpSocketErrorDomain Code=4 "Socket closed" UserInfo=0x2630c0 {NSLocalizedDescription=Socket closed}
Mniej niż przydatne.
Naprawiając to, chciałbym, aby działał z IPv6 zamiast wymuszać IPv4 ... wymuszanie IPv4 wydaje mi się kruche.