跳到正文

检查项 ​

一次诊断跑的是一个 mode 里的那些检查,mode 是一个 bit set,在探测任何东西之前 它会变成一个可以读出来的计划。

那几项检查 ​

检查项RustSwift共享 KotlinAndroidC
pingNetCheckType::PingCheck.pingCheck.Ping0MarsSdtCheckPing
dnsNetCheckType::DnsCheck.dnsCheck.Dns1MarsSdtCheckDns
对着另一个服务器做的 dns,用来比NetCheckType::NewDnsCheck.newDnsCheck.NewDns2MarsSdtCheckNewDns
tcpNetCheckType::TcpCheck.tcpCheck.Tcp3MarsSdtCheckTcp
httpNetCheckType::HttpCheck.httpCheck.Http4MarsSdtCheckHttp
traceroute —— 有计划,但还没有探测问它NetCheckType::TracerouteCheck.tracerouteCheck.Traceroute—MarsSdtCheckTraceroute
请求自己的 buffer —— 同上NetCheckType::ReqBufCheck.reqBufCheck.ReqBuf—MarsSdtCheckReqBuf

mode 由哪些 bit 组成 ​

那个 bitRust共享 Kotlin、AndroidSwiftC它往计划里放什么
NET_CHECK_BASICNET_CHECK_BASICCheckMode.K_BASIC.basicNET_CHECK_BASIC一次 ping 和一次 dns —— C++ 最先跑的就是这两项
NET_CHECK_LONGNET_CHECK_LONGK_LONG.longNET_CHECK_LONG一次 tcp:往长连接的 hosts 发一个 noop
NET_CHECK_SHORTNET_CHECK_SHORTK_SHORT.shortNET_CHECK_SHORT一次 http:那个 net-check CGI,以及短连接的 hosts

它们按位或起来 —— NET_CHECK_BASIC | NET_CHECK_LONG 是跑三项的一趟 —— 而 0 是 一项都不跑,而且没有哪个接口会跑它:三个 bit 一个都没有的 mode 在哪里都被拒绝 —— Rust 和共享 Kotlin 回答 false,Android 走的是同一个调用,C ABI 回答 MARS_SDT_ERR_BAD_ARG。所以 0 在任何平台上换来的都是“没启动”和一份拿不到的报告, 而不是一份空报告。它不是“全部都跑”,全部都跑是 1 | 2 | 4,在 Swift 里是 Mode.all。

Swift 把它们当成一个集合来收,mode: [.basic, .long];Objective-C 还是用那个整 数:mode: NET_CHECK_BASIC | NET_CHECK_LONG。

NET_CHECK_SHORT 是那个需要自己 hosts 的:这个 bit 配一个空的 shortLink,是一份 “http 检查但没有东西可检查”的计划,跑出来的报告关于短连接什么也没说。

先把计划读出来 ​

什么RustSwift共享 Kotlin、AndroidC
计划,按检查要跑的顺序sdt.plan()MarsSdt.planSdtLogic.plan()mars_sdt_plan

共享 Kotlin 交回来的是 Check,Android 是那些整数本身,而计划里的整数就是 报告每一项的 detectType —— 所以两边是同一套词。

接着看 ​

  • 探测 —— 每一项检查要 App 给什么,以及一个回答由什么构成。
  • 快速开始 —— 每个带着 SDT 的平台上的依赖和一整趟诊断。

MIT,与上游项目一致。