From a57f2888191e802c711952f08fb3bced6b437160 Mon Sep 17 00:00:00 2001 From: Akizon77 Date: Sun, 29 Jun 2025 17:05:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20ping=E9=94=99=E8=AF=AF=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=B8=8A=E4=BC=A0=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/task.go | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/server/task.go b/server/task.go index eebceff..6348502 100644 --- a/server/task.go +++ b/server/task.go @@ -103,23 +103,23 @@ func icmpPing(target string, timeout time.Duration) (int64, error) { // 先解析 IP 地址 ip, err := resolveIP(target) if err != nil { - return 0, err + return -1, err } pinger, err := ping.NewPinger(ip) if err != nil { - return 0, err + return -1, err } pinger.Count = 1 pinger.Timeout = timeout pinger.SetPrivileged(true) err = pinger.Run() if err != nil { - return 0, err + return -1, err } stats := pinger.Statistics() if stats.PacketsRecv == 0 { - return 0, errors.New("no packets received") + return -1, errors.New("no packets received") } return stats.AvgRtt.Milliseconds(), nil } @@ -128,7 +128,7 @@ func tcpPing(target string, timeout time.Duration) (int64, error) { addr := strings.Split(target, ":") ip, err := resolveIP(addr[0]) if err != nil { - return 0, err + return -1, err } port := "80" @@ -139,7 +139,7 @@ func tcpPing(target string, timeout time.Duration) (int64, error) { start := time.Now() conn, err := net.DialTimeout("tcp", targetAddr, timeout) if err != nil { - return 0, err + return -1, err } defer conn.Close() return time.Since(start).Milliseconds(), nil @@ -171,7 +171,7 @@ func httpPing(target string, timeout time.Duration) (int64, error) { resp, err := client.Get(target) latency := time.Since(start).Milliseconds() if err != nil { - return 0, err + return -1, err } defer resp.Body.Close() if resp.StatusCode >= 200 && resp.StatusCode < 400 { @@ -185,27 +185,31 @@ func NewPingTask(conn *ws.SafeConn, taskID uint, pingType, pingTarget string) { log.Printf("Invalid task ID: %d", taskID) return } - - pingResult := 0 + var err error = nil + var latency int64 + pingResult := -1 timeout := 3 * time.Second // 默认超时时间 switch pingType { case "icmp": - if latency, err := icmpPing(pingTarget, timeout); err == nil { + if latency, err = icmpPing(pingTarget, timeout); err == nil { pingResult = int(latency) } case "tcp": - if latency, err := tcpPing(pingTarget, timeout); err == nil { + if latency, err = tcpPing(pingTarget, timeout); err == nil { pingResult = int(latency) } case "http": - if latency, err := httpPing(pingTarget, timeout); err == nil { + if latency, err = httpPing(pingTarget, timeout); err == nil { pingResult = int(latency) } default: log.Printf("Unsupported ping type: %s", pingType) return } - + if err != nil { + log.Printf("Ping task %d failed: %v", taskID, err) + pingResult = -1 // 如果有错误,设置结果为 -1 + } payload := map[string]interface{}{ "type": "ping_result", "task_id": taskID, @@ -213,6 +217,9 @@ func NewPingTask(conn *ws.SafeConn, taskID uint, pingType, pingTarget string) { "value": pingResult, "finished_at": time.Now(), } + if pingResult == -1 { + return + } if err := conn.WriteJSON(payload); err != nil { log.Printf("Failed to write JSON to WebSocket: %v", err) }