Bonjourによってアドバタイズされている別のデバイス上のサーバーにUDP経由で接続しています。このコードが実行されているiOSデバイスとサーバーの両方がwifiネットワーク上にある場合、bonjourサービスはdhcpサーバーから渡される192.168.0.xxxアドレスに解決されるため、正常に機能します。ただし、Bluetoothによってアドバタイズされると、サービスが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
メソッドはsendを呼び出し、他のコールバックは基本的にこの時点では単なる情報(NSLog)です。これはに渡されるNSErrorudpSocketDidClose:withError
です:
Error Domain=GCDAsyncUdpSocketErrorDomain Code=4 "Socket closed" UserInfo=0x2630c0 {NSLocalizedDescription=Socket closed}
役に立たない。
これを修正する際に、IPv4を強制するのではなくIPv6で動作させたいと思います...IPv4を強制することは私には壊れやすいようです。