GCDAsyncUdpSocket немедленно закрывается при отправке на адрес IPv6
m подключение через UDP к серверу на другом устройстве, которое рекламируется Bonjour. Когда и устройство iOS, на котором работает этот код, и сервер, находятся в нашей сети Wi-Fi, это работает просто отлично, потому что служба bonjour разрешается по адресу 192.168.0.xxx, который раздает наш сервер dhcp. Однако, когда он объявляется через Bluetooth, иногда служба разрешается до 169.254.xxx.xxx (IPv4), и в этом случае она работает просто отлично. Но иногда он разрешается в fe80 :: xxxx: xxxx: xxxx: xxxx (IPv6), и в этом случае сокет подключается (я получаюudpSocket:didConnectToAddress
обратный вызов), но сразу же закрывается, когда я пытаюсь отправить данные (я получаюudpSocketDidClose:withError
обратный звонок сразу после звонка отправить).
- (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;
}
мойudpSocket:didConnectToAddress
метод вызывает send, и мои другие обратные вызовы в основном просто информационные (NSLog) на данный момент. Это ошибка NSE, переданная:udpSocketDidClose:withError
Error Domain=GCDAsyncUdpSocketErrorDomain Code=4 "Socket closed" UserInfo=0x2630c0 {NSLocalizedDescription=Socket closed}
Менее чем полезно.
В исправлении этого яя хотел бы заставить его работать с IPv6 вместо принудительного IPv4 ... форсирование IPv4 мне кажется хрупким.