57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"net"
|
||
"time"
|
||
)
|
||
|
||
// LatencyInfo 延迟信息
|
||
type LatencyInfo struct {
|
||
ClientToServer float64 `json:"clientToServer"` // 客户端到服务器延迟(ms),由前端计算
|
||
External map[string]string `json:"external"` // 外部网站延迟
|
||
}
|
||
|
||
// checkExternalLatency 检测外部网站延迟
|
||
func checkExternalLatency(host string, timeout time.Duration) string {
|
||
start := time.Now()
|
||
|
||
// 尝试 TCP 连接 80 端口
|
||
conn, err := net.DialTimeout("tcp", host+":80", timeout)
|
||
if err != nil {
|
||
// 如果 80 端口失败,尝试 443 (HTTPS)
|
||
conn, err = net.DialTimeout("tcp", host+":443", timeout)
|
||
if err != nil {
|
||
return "超时"
|
||
}
|
||
}
|
||
defer conn.Close()
|
||
|
||
latency := time.Since(start).Milliseconds()
|
||
|
||
// 检查是否超时(超过超时时间的一半就认为可能有问题)
|
||
if latency > timeout.Milliseconds()/2 {
|
||
return "超时"
|
||
}
|
||
|
||
return fmt.Sprintf("%d ms", latency)
|
||
}
|
||
|
||
// readExternalLatencies 读取外部网站延迟
|
||
func readExternalLatencies() map[string]string {
|
||
latencies := make(map[string]string)
|
||
timeout := 3 * time.Second
|
||
|
||
// 检测百度
|
||
latencies["baidu.com"] = checkExternalLatency("baidu.com", timeout)
|
||
|
||
// 检测谷歌
|
||
latencies["google.com"] = checkExternalLatency("google.com", timeout)
|
||
|
||
// 检测 GitHub
|
||
latencies["github.com"] = checkExternalLatency("github.com", timeout)
|
||
|
||
return latencies
|
||
}
|
||
|