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) }