iPhone:IPv4 Wi-Fi访问失败,启用了蜂窝无线电

时间:2017-12-19 07:10:23

标签: ios objective-c iphone sockets gcdasyncsocket

我有一个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)建议重试,直到事情有效,但我没有取得任何成功。)

1 个答案:

答案 0 :(得分:0)

我无法弄清为什么这种情况发生了:它影响了佛罗里达州和加利福尼亚州T-Mobile上的至少两个人,但我无法使用T-Mobile复制它在华盛顿。

我确实找到了修复方法:将connectToHost替换为connectToAddress,它直接连接到IPv4地址而无需DNS解析步骤。虽然connectToHost允许主机名或IP地址,但即使使用IP地址,它也会运行DNS查找步骤,并且当受影响的iDevices连接到T-Mobile时发生的任何事情都会混淆查找。