feat: ping错误时不再上传数据

This commit is contained in:
Akizon77
2025-06-29 17:05:13 +08:00
parent 9e35c5180e
commit a57f288819

View File

@@ -103,23 +103,23 @@ func icmpPing(target string, timeout time.Duration) (int64, error) {
// 先解析 IP 地址 // 先解析 IP 地址
ip, err := resolveIP(target) ip, err := resolveIP(target)
if err != nil { if err != nil {
return 0, err return -1, err
} }
pinger, err := ping.NewPinger(ip) pinger, err := ping.NewPinger(ip)
if err != nil { if err != nil {
return 0, err return -1, err
} }
pinger.Count = 1 pinger.Count = 1
pinger.Timeout = timeout pinger.Timeout = timeout
pinger.SetPrivileged(true) pinger.SetPrivileged(true)
err = pinger.Run() err = pinger.Run()
if err != nil { if err != nil {
return 0, err return -1, err
} }
stats := pinger.Statistics() stats := pinger.Statistics()
if stats.PacketsRecv == 0 { if stats.PacketsRecv == 0 {
return 0, errors.New("no packets received") return -1, errors.New("no packets received")
} }
return stats.AvgRtt.Milliseconds(), nil return stats.AvgRtt.Milliseconds(), nil
} }
@@ -128,7 +128,7 @@ func tcpPing(target string, timeout time.Duration) (int64, error) {
addr := strings.Split(target, ":") addr := strings.Split(target, ":")
ip, err := resolveIP(addr[0]) ip, err := resolveIP(addr[0])
if err != nil { if err != nil {
return 0, err return -1, err
} }
port := "80" port := "80"
@@ -139,7 +139,7 @@ func tcpPing(target string, timeout time.Duration) (int64, error) {
start := time.Now() start := time.Now()
conn, err := net.DialTimeout("tcp", targetAddr, timeout) conn, err := net.DialTimeout("tcp", targetAddr, timeout)
if err != nil { if err != nil {
return 0, err return -1, err
} }
defer conn.Close() defer conn.Close()
return time.Since(start).Milliseconds(), nil return time.Since(start).Milliseconds(), nil
@@ -171,7 +171,7 @@ func httpPing(target string, timeout time.Duration) (int64, error) {
resp, err := client.Get(target) resp, err := client.Get(target)
latency := time.Since(start).Milliseconds() latency := time.Since(start).Milliseconds()
if err != nil { if err != nil {
return 0, err return -1, err
} }
defer resp.Body.Close() defer resp.Body.Close()
if resp.StatusCode >= 200 && resp.StatusCode < 400 { 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) log.Printf("Invalid task ID: %d", taskID)
return return
} }
var err error = nil
pingResult := 0 var latency int64
pingResult := -1
timeout := 3 * time.Second // 默认超时时间 timeout := 3 * time.Second // 默认超时时间
switch pingType { switch pingType {
case "icmp": case "icmp":
if latency, err := icmpPing(pingTarget, timeout); err == nil { if latency, err = icmpPing(pingTarget, timeout); err == nil {
pingResult = int(latency) pingResult = int(latency)
} }
case "tcp": case "tcp":
if latency, err := tcpPing(pingTarget, timeout); err == nil { if latency, err = tcpPing(pingTarget, timeout); err == nil {
pingResult = int(latency) pingResult = int(latency)
} }
case "http": case "http":
if latency, err := httpPing(pingTarget, timeout); err == nil { if latency, err = httpPing(pingTarget, timeout); err == nil {
pingResult = int(latency) pingResult = int(latency)
} }
default: default:
log.Printf("Unsupported ping type: %s", pingType) log.Printf("Unsupported ping type: %s", pingType)
return return
} }
if err != nil {
log.Printf("Ping task %d failed: %v", taskID, err)
pingResult = -1 // 如果有错误,设置结果为 -1
}
payload := map[string]interface{}{ payload := map[string]interface{}{
"type": "ping_result", "type": "ping_result",
"task_id": taskID, "task_id": taskID,
@@ -213,6 +217,9 @@ func NewPingTask(conn *ws.SafeConn, taskID uint, pingType, pingTarget string) {
"value": pingResult, "value": pingResult,
"finished_at": time.Now(), "finished_at": time.Now(),
} }
if pingResult == -1 {
return
}
if err := conn.WriteJSON(payload); err != nil { if err := conn.WriteJSON(payload); err != nil {
log.Printf("Failed to write JSON to WebSocket: %v", err) log.Printf("Failed to write JSON to WebSocket: %v", err)
} }