iPhone:IPv4 Wi-Fi访问在启用蜂窝无线电的情况下失败



我有一个iPhone应用程序,该应用程序在Wi-Fi上制作了UPNP查询,可以使用GCDASYNCSOCTED来定位Wi-Fi连接的相机。所有通信都使用由摄像机本身创建的临时网络上的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订阅消息:

_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] fimeTimeout:超时标签: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"

各种Googleings表明"没有主机的路线"表明IPv4地址无法在IPv6环境中解决,并且" IPv6已被禁用,DNS查找没有IPv4地址"消息是自称的。p>为什么在这款iPhone上发生这种情况,而不是在其他所有iPhone上发生(包括我自己的测试仪器)?除了说"关闭蜂窝数据"之外,我该如何解决?如果我已经使用了我已经连接到的"临时访问点"的IPv4地址(临时接入点),以使网络首先运行?

,为什么还涉及DNS?

(另一个stackoverflow帖子(GCDASYNCUDPSOCTED发送到IPv6地址时,立即关闭)建议重试直到工作起作用,但我对此没有任何成功。)

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

我确实找到了一个修复程序:将connectToHost替换为connectToAddress,它在没有DNS分辨率步骤的情况下直接连接到IPv4地址。虽然connectToHost允许主机名或IP地址,但即使使用IP地址,它也会运行DNS查找步骤,并且当受影响的IDEVICES连接到T-Mobile时发生的任何事情都会混淆。

相关内容

最新更新