检查是否连接到互联网?求一个优雅的思路

2020-03-28 02:00:59 +08:00
 black11black
如题,业务需要程序自检是否能连接到互联网,如果断网需要立即做出反应,要求是反应足够快。

一个简单的想法是每秒访问指定网站,来检测连通性,这样可以规避一些“假连通”的情况,但是稳定提供服务的网站很难找。比如请求百度的话,其实历史上百度也是挂过的,还不止挂过一次。。。

服务器在国内
27589 次点击
所在节点    Linux
41 条回复
xsen
2020-03-28 12:39:22 +08:00
竟然是业务代码,那就应该与自己业务服务器的连通性检测
你通过别的来检测又多大意义,网络是好的,业务服务器挂了——难道也是可用?

做法是越简单越好。连接的异常处理(比如 socket 异常,包括传输或物理连接断开),加上心跳机制
这都是非常通用与成熟的做法
realpg
2020-03-28 14:43:12 +08:00
百度的人委托我匿名向楼主求助 百度啥时候挂了?
lower
2020-03-28 15:04:28 +08:00
@xsen 正确的做法就是 请求自己服务器,接口返回了未知的错误,然后客户端一律提示“网络出问题” (狗头.jpg)
skylancer
2020-03-28 15:11:58 +08:00
很多人不知道 Cloudflare 也有 captive portal, http 和 https 都行,甚至可以直接用来替代 Android 的 captive portal detection

cp.cloudflare.com
580a388da131
2020-03-28 16:47:26 +08:00
@lower 国外不知道,国内的不少应用尤其是大厂,自家服务器连不上就提示你的网络有问题,简直烦死。
black11black
2020-03-28 17:03:53 +08:00
@realpg
@wd
我自己经历过的比如有根服务器错误导致百度 DNS 出问题的时候,印象中 14 年左右?
black11black
2020-03-28 17:06:00 +08:00
@xsen 很显然我要确保 general purpose 的连通性,业务可能向各种非自有位置发起网络连接,业务地址也可能有多个,显然维护单一业务服务器连通性是非常不好管理的做法。
yzc27
2020-03-28 17:47:43 +08:00
看能不能打开百度(手动狗头
crella
2020-03-28 18:46:58 +08:00
就算是春晚,百度搜索首页也是打得开的吧,不是说只是抢红包页面假死和百度手机助手无响应吗,同时一堆 app 应用商城打不开。
Windelight
2020-03-28 19:47:32 +08:00
如果是自己的服务器呢?要不尝试建立一下 WebSocket 空连接,每秒来个 Ping,反应速度几十 ms 或者 100 多 ms ?
jiangzhuo
2020-03-28 22:30:09 +08:00
ping Google
-- 通 互联网
-- 不通
-- ping 微软
-- 通 互联网
-- 不通
-- ping 百度
-- 通 局域网
-- 不通
-- ping 京东
-- 通 局域网
-- 不通 没网
pperlee
2020-03-28 22:33:56 +08:00
搞多几个 dns 随便 ping,也不会大规模下线。
john6lq
2020-03-28 22:35:08 +08:00
各个平台都有提供网络状态监听的 API 不用?一直 ping 不是很蠢?
ujued
2020-03-28 23:11:47 +08:00
@john6lq 服务端标准库都不带这种监听的。要求实时性,还是得业务自己 ping 老弟
wangyzj
2020-03-28 23:37:24 +08:00
qq 自动登陆了的声音
ClericPy
2020-03-29 00:25:31 +08:00
优雅不优雅我不知道... 以前随手写了个凑合用... 反正就是找个几个 DNS 的 IP 连着玩玩, 尽量不产生流量就行了

import socket;socket.create_connection(('114.114.114.114', 53)).close()
black11black
2020-03-29 13:24:56 +08:00
@ClericPy 我觉得挺好的,经济实惠
pokon548
2020-04-05 09:18:34 +08:00
downforeveryoneorjustme
whusnoopy
2020-10-19 09:43:19 +08:00
@realpg https://zh.wikipedia.org/wiki/2010%E5%B9%B4%E7%99%BE%E5%BA%A6%E5%9F%9F%E5%90%8D%E8%A2%AB%E5%8A%AB%E6%8C%81%E4%BA%8B%E4%BB%B6

2010 年百度域名被劫持事件是 2010 年 1 月 12 日针对百度的一次域名劫持事件。当天,中国大陆最大中文搜索引擎公司百度被自称是伊朗网军( Iranian Cyber Army )的黑客组织入侵,导致网民无法正常登陆百度网站达 8 小时。
bclerdx
2021-01-10 23:13:06 +08:00
@jinliming2 Google 的弄了这么多 Captive Portal 网址?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/656983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX