iOS - 使用 3G 随机“无法连接到主机”
Posted
技术标签:
【中文标题】iOS - 使用 3G 随机“无法连接到主机”【英文标题】:iOS - random "Cannot connect to host" with 3G 【发布时间】:2012-07-29 16:59:16 【问题描述】:我正在开发一个 ios 应用程序,该应用程序用作业务服务器的瘦客户端。向服务器发送了很多请求,下载了很多数据。
我不使用任何花哨的请求框架,只是使用代理异步 NSURLConnection
。
该应用程序通常适用于 wifi 和 3G 但是
一些用户在使用 3G 时报告随机断开连接(在美国)。所有请求都正常,但有时请求会因“无法连接到主机”(-1004) 错误而失败。
这对用户体验影响很大。
一些事实:
-
在 wifi 上不会发生这种情况
用户反映在使用 3G 时其他应用程序不会发生这种情况。
不是超时问题,启动连接后0.3-1.0秒出现错误。
我们无法使用 traceroute 重现该问题。
使用
SCNetworkReachability
似乎可以访问主机(我知道此 API 的局限性)。
问题问题的原因可能是什么? 3G 和 wifi 的连接属性有哪些不同?如何调试?
目前我看到的唯一解决方案是如果上一个请求失败,则尝试再次发送请求。但是,我想先找到问题的原因。
编辑 问题可能是由我们的一台路由器引起的。 IT 人员仍在检查问题。
【问题讨论】:
让我们看看你的代码。我知道你的单元测试通过了,但以防万一;) 【参考方案1】:所有错误代码都可以在 Apple 文档中找到
CFNetwork Error Codes Reference
代码-1004仅描述为
kCFURLErrorCannotConnectToHost
连接失败,因为 无法与主机建立连接。适用于 OS X v10.6 和 之后。在 CFNetworkErrors.h 中声明。
这基本上意味着用户有连接(他未处于飞行模式,数据流量已打开,他的手机已在网络中注册,您有一个有效的 URL 等)但被主动阻止连接到服务器。如您所描述的,如果服务器没有响应,那么在较长的等待时间后,您可能会遇到类似超时错误的情况。 此类错误可能是由阻止到服务器的流量引起的,例如,如果用户位于防火墙或代理之后。
该问题实际上可能是由提供商引起的,尤其是如果您对某些用户没有问题,而对其他用户没有任何问题。
正如其他发帖人所说,您可以尝试向您的用户询问他们的服务提供商,以及有关他们所在位置的更多详细信息,或者当他们遇到错误时他们在做什么(例如坐在车上或在农村)
如果您找不到任何模式,并且如果错误真的只是随机发生并且仅针对某些用户,而且只是有时,我会认为这是另一个不可避免的问题,可能是由于 手机永远无法保证始终保持连接,而且某些手机提供商可能无法始终交付 100% 应交付的所有包裹……您需要做的只是处理错误。
只需重试即可消除错误,而不是向用户显示,至少要等到足够的重试次数之后。
最后一件事要考虑:
如果您从应用发送大量请求以及大量数据,请确保您不会通过发送大量未完成的请求来“过度消耗”。这可能会导致途中的服务器或某些代理服务器拒绝您的请求,因为它正忙于回答您的其他请求。被拒绝的请求可能会导致这样的错误。确保发送合理数量的请求,以便用户的设备有时间“呼吸”。
让您的重试方案成为一个聪明的方案,您可以先在较短的时间内重试多次,如果一直失败,请增加下一次重试的时间跨度。
【讨论】:
虽然这个答案并没有告诉我任何新的东西,但它可能是最好的答案。我将添加重试。 检查挂起的网络请求的返回码没有任何作用。自从挂了。 不仅如此,您还必须为应用程序中的每个网络请求构建一个线程、一个运行循环、一个超时和一个重试计数,以完成您所说的......不是正确的解决方案。 它没有挂起,因为它因错误而失败。当请求失败时,意味着它已经放弃了。如果你想要数据,你必须发送一个新的请求。如果仍有可达性,没有理由不再做一次。您不必为每个请求使用数百个线程和一个处理程序,如果您正在处理许多请求,您可以编写代码来集中并在一个地方处理它们并确保它们表现良好。仅仅检查可达性然后轰炸请求,因为你假设它会工作不是一个非常稳定的解决方案。【参考方案2】:我会重新考虑它只会影响您的应用程序的假设。有很多方法用户可能只会看到您的应用程序的问题,即使问题出在他们的 Internet 连接上。例如,也许其他应用程序透明地重试 - 用户只会看到更新速度较慢。或者,可能断开的连接对其他应用程序根本不重要。
您是否询问过受影响的用户他们使用的是哪个提供商?如果他们都使用相同的移动网络,则表明这是网络问题,而不是您的应用程序。
【讨论】:
【参考方案3】:在我看来,造成这种情况的原因仅仅是蜂窝数据和互联网访问的性质。您可能知道,当您使用蜂窝连接时,有时 - 特别是在您移动时,连接会随着广播塔的变化而切换网络。
您提到您正在下载大量数据并且间隔很短,我认为这会使您的应用程序更容易出现此问题,并且我不会接受其他应用程序不会发生这种情况的一秒钟- 这是关于时间的。
【讨论】:
以上是关于iOS - 使用 3G 随机“无法连接到主机”的主要内容,如果未能解决你的问题,请参考以下文章
为啥使用 dispatch_async() 方法时 AsyncSocket 无法连接到主机?
Windows 10 上的 RabbitMQ - 无法连接到 epmd:地址(无法连接到主机/端口)