Bonjour에서 광고하는 다른 장치의 서버에 UDP를 통해 연결합니다. 이 코드가 실행되는 iOS 장치와 서버가 모두 wifi 네트워크에 연결되어 있으면 bonjour 서비스가 dhcp 서버가 전달하는 192.168.0.xxx 주소로 연결되기 때문에 정상적으로 작동합니다. 그러나 블루투스로 광고를하는 경우 서비스가 169.254.xxx.xxx (IPv4)로 해결되는 경우도 있습니다.이 경우 제대로 작동합니다. 하지만 때로는 fe80 :: xxxx : xxxx : xxxx : xxxx (IPv6)로 소켓을 연결하는 경우 (내가 udpSocket:didConnectToAddress
콜백을 받음) 즉시 데이터를 보내려고 할 때 닫힙니다. 전화를 걸면 즉시 udpSocketDidClose:withError
콜백을받습니다. .IPv6 주소로 보낼 때 GCDAsyncUdpSocket이 즉시 닫습니다.
- (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}
이하.
이 문제를 해결하기 위해 강제로 IPv4 대신 강제로 작동하도록하고 싶습니다. IPv4를 강요하는 것은 나에게 취약한 것처럼 보입니다.