O GCDAsyncUdpSocket fecha imediatamente ao enviar para um endereço IPv6
Estou conectando via UDP a um servidor em um dispositivo diferente que é anunciado pelo Bonjour. Quando o dispositivo iOS em que este código está sendo executado e o servidor estão em nossa rede Wi-Fi, ele funciona bem, porque o serviço bonjour resolve para um endereço 192.168.0.xxx que o nosso servidor dhcp distribui. No entanto, quando é anunciado pelo bluetooth, às vezes o serviço resolve para 169.254.xxx.xxx (IPv4), caso em que funciona muito bem. Mas às vezes resolve para fe80 :: xxxx: xxxx: xxxx: xxxx (IPv6), caso em que o soquete se conecta (eu recebo oudpSocket:didConnectToAddress
callback), mas fecha imediatamente quando tento enviar dados (eu receboudpSocketDidClose:withError
callback imediatamente ao chamar o send).
- (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;
}
MinhasudpSocket:didConnectToAddress
método chama um envio e meus outros retornos de chamada são basicamente apenas informativos (NSLog) neste momento. Este é o erro do NSE passado paraudpSocketDidClose:withError
:
Error Domain=GCDAsyncUdpSocketErrorDomain Code=4 "Socket closed" UserInfo=0x2630c0 {NSLocalizedDescription=Socket closed}
Menos que útil.
Ao corrigir isso, eu gostaria de fazê-lo funcionar com o IPv6, em vez de forçar o IPv4 ... forçar o IPv4 só me parece frágil.