我有一个iPhone应用程序使用GCDAsyncSocket通过Wi-Fi进行UPnP查询以找到连接Wi-Fi的相机。所有通信都通过摄像机本身创建的ad-hoc网络使用IPv4地址,并且该应用程序正在进行2500多个现场部署。
但是,除非飞行模式开启,或者关闭了手机数据,否则我的iPhone上有一个客户失败。同样的相机可以用他的iPad mini工作得很好,所以我们不能确定相机的错误。
该应用程序设置了一个侦听套接字:
_listenSocket = [[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)];
_listenSocket.IPv6Enabled = NO;
accepted = [_listenSocket acceptOnInterface:getWirelessInterface()
port:_upnpPort error:&error];
然后设置发送套接字,同时禁用IPV6;通过无线接口连接到主机(在已知或可疑的IP地址);并发送UPnP SUBSCRIBE消息:
_sendSocket = [[GCDAsyncSocket alloc] initWithDelegate:self
delegateQueue:dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)];
if (!_sendSocket) {
NSLog(@"sendMsg: unable to allocate sendSocket");
return;
}
_sendSocket.IPv6Enabled = NO;
NSError *err = nil;
if (![_sendSocket connectToHost:hostParts[0]
onPort:[hostParts[1] intValue]
viaInterface:getWirelessInterface()
withTimeout:TIMEOUT
error:&err]) // Asynchronous!
{
// If there was an error, it's likely something like
// "already connected" or "no delegate set"
NSLog(@"socket connectToHost error: %@", err);
return;
}
[_ sendSocket writeData:[msg dataUsingEncoding:NSUTF8StringEncoding] withTimeout:TIMEOUT tag:1];
通常,这可以按预期工作。但是,在这种情况下,发送失败;委托方法socketDidDisconnect:withError:被调用:
sendSocket disconnected with error: Error Domain=GCDAsyncSocketErrorDomain
Code=8 "IPv6 has been disabled and DNS lookup found no IPv4 address."
如果我删除" xxxSocket.IPv6Enabled = NO;"线条,我得到了这个:
listenSocket disconnected with error: Error Domain=NSPOSIXErrorDomain
Code=65 "No route to host"
各种谷歌搜索表明"没有主持人的路由"表示无法在IPv6环境中解析IPv4地址,并且已禁用" IPv6并且DNS查找未找到IPv4地址"消息是不言自明的。
为什么会在这个iPhone上发生这种情况,而不是所有其他的(包括我自己的测试仪器)?我怎么能解决它,除了说"关闭蜂窝数据"?如果我使用了已经连接到的路由器(ad-hoc接入点)的IPv4地址以便首先运行网络,为什么还要涉及DNS?
(另一个stackoverflow帖子(GCDAsyncUdpSocket immediately closes when sending to an IPv6 address)建议重试,直到事情有效,但我没有取得任何成功。)
答案 0 :(得分:0)
我无法弄清为什么这种情况发生了:它影响了佛罗里达州和加利福尼亚州T-Mobile上的至少两个人,但我无法使用T-Mobile复制它在华盛顿。
我确实找到了修复方法:将connectToHost
替换为connectToAddress
,它直接连接到IPv4地址而无需DNS解析步骤。虽然connectToHost
允许主机名或IP地址,但即使使用IP地址,它也会运行DNS查找步骤,并且当受影响的iDevices连接到T-Mobile时发生的任何事情都会混淆查找。