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.

questionAnswers(2)

yourAnswerToTheQuestion