Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
black11black
V2EX  ›  Linux

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

  •  
  •   black11black · Mar 28, 2020 via Android · 31583 views
    This topic created in 2413 days ago, the information mentioned may be changed or developed.
    如题,业务需要程序自检是否能连接到互联网,如果断网需要立即做出反应,要求是反应足够快。

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

    服务器在国内
    41 replies  •  2023-03-12 00:56:25 +08:00
    wwwjfy
    wwwjfy
    Mar 28, 2020❤️1
    1
    每次找多个大的网站就行,同时挂的机率可以忽略,除非大灾害
    imdong
    imdong
    Mar 28, 2020 via iPhone
    2
    那还有地区性网络故障?
    获取本地运营商 DNS,然后 ping ?
    wd
    wd
    Mar 28, 2020 via iPhone❤️1
    3
    你是的历史上百度挂掉是什么时候?
    ysc3839
    ysc3839
    Mar 28, 2020 via Android❤️20
    4
    Windows 是通过请求 http://www.msftconnecttest.com/connecttest.txt ,然后判断返回的内容来判断是否联网的。
    Android 是先请求 https://www.google.com/generate_204 如果返回的状态码不是 204,则请求 http://connectivitycheck.gstatic.com/generate_204 来检测是否需要登录。
    wwbfred
    wwbfred
    Mar 28, 2020❤️2
    5
    就用楼上那个微软的就很好,那个就是 windows 用的判断方法.
    不行就多找几个,谷歌微软苹果百度一起上,通一个就是通了.
    seki
    seki
    Mar 28, 2020
    6
    只要这个大型网站 SLA 比你的目标高若干个等级就好了,而且一年个位数假警报,应该也算可以接受吧

    比较好用的也许是 204
    iamwho
    iamwho
    Mar 28, 2020
    7
    NTP Server
    AoTmmy
    AoTmmy
    Mar 28, 2020 via Android
    8
    alphatoad
    alphatoad
    Mar 28, 2020
    9
    captive.apple.com
    全球都可访问(包括中国
    input2output
    input2output
    Mar 28, 2020
    10
    内地可以 ping 1.2.4.8
    AllenHua
    AllenHua
    Mar 28, 2020 via iPhone
    11
    多来几个服务器 有一个能连通就算已连接到互联网
    reus
    reus
    Mar 28, 2020 via Android
    12
    先连腾讯,失败再连淘宝,失败再连百度,三家都出问题的概率应该极低。重点是失败了再测试下一个,这样大部分时间的开销和只连一个是一样的,也就是一家响应就是联网了,三家都不响应才是断网。
    aguesuka
    aguesuka
    Mar 28, 2020 via Android❤️1
    13
    1.1.1.1
    ujued
    ujued
    Mar 28, 2020 via iPhone
    15
    一直 ping 8.8.8.8,一段时间内,安丢包率判断网络状态。

    运维给出的意见,仅供参考。
    Les1ie
    Les1ie
    Mar 28, 2020
    16
    http://detectportal.firefox.com/success.txt

    注意:
    这个网址支持 ipv6,当设备只能访问 ipv6 不能访问 ipv4 的时候,依然会返回 success
    BFDZ
    BFDZ
    Mar 28, 2020
    17
    pool.ntp.org
    今天活跃的服务器有 4228 台
    barrelsoil
    barrelsoil
    Mar 28, 2020 via Android
    18
    概率论学好,百度历史上挂过,概率多少?

    2 个类似百度的大网站呢?概率一乘又是多少
    diggerdu
    diggerdu
    Mar 28, 2020 via iPhone
    19
    m30102
    m30102
    Mar 28, 2020
    20
    访问 百度 腾讯 新浪 服务器,3 个都挂那么则不能联网
    xsen
    xsen
    Mar 28, 2020❤️3
    21
    竟然是业务代码,那就应该与自己业务服务器的连通性检测
    你通过别的来检测又多大意义,网络是好的,业务服务器挂了——难道也是可用?

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

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

    import socket;socket.create_connection(('114.114.114.114', 53)).close()
    black11black
    black11black
    OP
    Mar 29, 2020
    37
    @ClericPy 我觉得挺好的,经济实惠
    pokon548
    pokon548
    Apr 5, 2020
    38
    downforeveryoneorjustme
    whusnoopy
    whusnoopy
    Oct 19, 2020
    39
    @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
    bclerdx
    Jan 10, 2021
    40
    @jinliming2 Google 的弄了这么多 Captive Portal 网址?
    bclerdx
    bclerdx
    Mar 12, 2023
    41
    @whusnoopy 已收藏!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2004 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 97ms · UTC 16:27 · PVG 00:27 · LAX 08:27 · JFK 11:27
    ♥ Do have faith in what you're doing.