我通过 UDP 连接到 Bonjour 宣传的不同设备上的服务器。当运行此代码的 iOS 设备和服务器都在我们的 wifi 网络上时,它工作得很好,因为 bonjour 服务解析为我们的 dhcp 服务器分发的 192.168.0.xxx 地址。但是,当它通过蓝牙进行广告时,有时服务会解析为 169.254.xxx.xxx (IPv4),在这种情况下它工作得很好。但有时它会解析为 fe80::xxxx:xxxx:xxxx:xxxx (IPv6),在这种情况下,套接字连接(我收到udpSocket:didConnectToAddress
回调)但在我尝试发送数据时立即关闭(我udpSocketDidClose:withError
在调用 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;
}
我的udpSocket:didConnectToAddress
方法调用了发送,此时我的其他回调基本上只是信息性的(NSLog)。这是传递给的 NSError udpSocketDidClose:withError
:
Error Domain=GCDAsyncUdpSocketErrorDomain Code=4 "Socket closed" UserInfo=0x2630c0 {NSLocalizedDescription=Socket closed}
用处不大。
在解决这个问题时,我想让它与 IPv6 一起工作,而不是强制 IPv4 ......强制 IPv4 对我来说似乎很脆弱。