通而不达网络的发现与解决方案

本文介绍了通而不达网络的特点及诊断方法。此类网络虽然显示已连接,但实际上无法正常通信,表现为无法接收服务器响应且connect操作会出现75秒超时。文章还提供了通过心跳监测来识别此类网络的具体实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通而不达网络又称受限网络。若连接到这样的网络,手机收到的是网络正常通知,手机状态栏出现正常的wifi标志。若已经连接上后切换到这种网络,select函数监控不到异常(正常的响应超时,网络错误码errno有时间为45有时间为22,但是我们的socket在正常的情况下有时间errno为9,有时间为22,所以根据errno判断不出来这种异常),但是收不到服务器发回的所有响应(类似于 iphone手机里设置的弱网测试,丢失率为100%的设置情况)。在这种网络下发起connect 连接,那么会出现典型的75秒超时的情况。所以通而不达的网络典型特征是connect 75秒超时。通而不达网络通常是网络防火墙禁止了用户随意访问外网,进行了身份识别和登录。
既然网络通知,select函数, connect函数及网络错误码(errno)都不能准确定位出这类异常网络,那么解决这样的通而不达网络的办法代价很大,只能用心跳的方式发现这类网络。毕竟这类的网络很罕见,一般通过连接3次或超过75*2秒没有连接上,或没75秒发送一次心跳,若服务器无法实时响应(10秒)就判定它为通而不达网络。
aibinjiang这个网络在登录连接上切换到后台,到了无信号区自动切换到4g网络,后进入aibinjiang信号区,在次离开该信号区,自动切换到4g网络。在connect连接时1毫秒给予响应,结果为1(0为正常,非零为失败),返回的错误码是65(网关或主机不可达),53(软件引起的连接异常)。

连接aibinjiang公交wifi网络异常日志:

15/12/03 08:13:18:422  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1807 Debug:connect before:_connectTime = 1449101598421, Thread Sno: 18
2015/12/03 08:13:18:422  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1811 Debug:connect after:_connectTime = 1449101598422, Thread Sno: 18
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2586 Debug:ret = 1
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2598 Debug:pipe data:GuardThreadStartMonitor
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1865 Debug:errno:65
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2613 Debug:收到守护线程开始监控的消息,开始实时监控长连接线程:GuardThreadStartMonitor
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1880 Debug:i= -1
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1882 Debug:error : 65
2015/12/03 08:13:18:423  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2586 Debug:ret = 1
2015/12/03 08:13:18:424  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2530 Debug:socket err 
2015/12/03 08:13:18:424  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2598 Debug:pipe data:GuardThreadIdle
2015/12/03 08:13:18:424  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2549 Debug:sleep: 1秒
2015/12/03 08:13:18:424  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2604 Debug:收到守护线程空闲的消息,停止实时监控长连接线程:GuardThreadIdle
2015/12/03 08:13:19:372  Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函数
2015/12/03 08:13:19:372  Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函数
2015/12/03 08:13:19:372  Singleton.m:-[Singleton getLatitudeAll]:392 Debug:函数
2015/12/03 08:13:19:372  Singleton.m:-[Singleton getLongitudeAll]:404 Debug:函数
2015/12/03 08:13:19:372  Singleton.m:-[Singleton getDistanceWithStartLat:startLng:endLat:endLng:]:564 Debug:函数
2015/12/03 08:13:19:489  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1650 Debug:SKIP fd= 19
2015/12/03 08:13:19:489  Singleton.m:-[Singleton getLoginOrderStat]:265 Debug:函数
2015/12/03 08:13:19:489  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1735 Debug:socket sucess 
2015/12/03 08:13:19:489  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1736 Debug:g_fd= 19
2015/12/03 08:13:19:489  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1741 Debug:main loop 
2015/12/03 08:13:19:490  Singleton.m:-[Singleton getLoginOrderStat]:265 Debug:函数
2015/12/03 08:13:19:490  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函数
2015/12/03 08:13:19:490  SingleAsyncSocket.m:-[SingleAsyncSocket getNetworkStatus]:54 Debug:函数
2015/12/03 08:13:19:490  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1807 Debug:connect before:_connectTime = 1449101599489, Thread Sno: 18
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2586 Debug:ret = 1
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1811 Debug:connect after:_connectTime = 1449101599491, Thread Sno: 18
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2598 Debug:pipe data:GuardThreadStartMonitor
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1865 Debug:errno:65
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2613 Debug:收到守护线程开始监控的消息,开始实时监控长连接线程:GuardThreadStartMonitor
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2586 Debug:ret = 1
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2598 Debug:pipe data:GuardThreadIdle
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__32-[SingleAsyncSocket guardThread]_block_invoke:2604 Debug:收到守护线程空闲的消息,停止实时监控长连接线程:GuardThreadIdle
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1880 Debug:i= -1
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:1882 Debug:error : 65
2015/12/03 08:13:19:492  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2530 Debug:socket err 
2015/12/03 08:13:19:493  SingleAsyncSocket.m:__36-[SingleAsyncSocket socketBSDThread]_block_invoke:2549 Debug:sleep: 1秒

iphone手机弱设置(用来模拟测试应用在不通网络环境下的健壮性),在设置->开发者->Status(Network Link Condtioner)里设置。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值