V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
black11black
V2EX  ›  Linux

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

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

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

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

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

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

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

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

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

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

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