Das Hauptziel besteht darin, offene UDP-Ports zu erkennen, indem Daten über den Port gesendet und auf eingehende ICMP-Nachrichten gewartet wird, wenn der Port nicht erreichbar ist. Verwenden Sie dazu die folgende Go-Funktion, um sie als Goroutine auszuführen:
func listenIcmp(ipAddr string) { conn, err := icmp.ListenPacket("ip4:1", ipAddr) if err != nil { log.Println("Error while listening for ICMP packets: ") log.Println(err) } for { var incoming []byte length, sourceIP, err := conn.ReadFrom(incoming) if err != nil { log.Println(err) continue } log.Printf("message = '%s', length = %d, source-ip = %s", string(incoming), length, sourceIP) } }
Dies kann ICMP-Pings und die Nichterreichbarkeit des Ziels erkennen, gibt jedoch immer eine Nachricht der Länge 0 zurück. Beispiel:
2023/10/11 14:38:32 消息 = '',长度 = 0,源 IP = 127.0.0.1
Ich habe versucht, die Nachricht zu analysieren, aber da sie leer ist, wird ein Laufzeitfehler zurückgegeben. Außerdem habe ich der go-ausführbaren Datei Root-Berechtigungen erteilt, aber das hat auch nicht funktioniert.
EDIT: Betriebssystem ist Ubuntu 20.04
Habe meinen eigenen Fehler bemerkt...
Ich habe versucht, aus einem nicht initialisierten Puffer zu lesen. Durch die folgenden Änderungen am Eingangspuffer wird das Problem behoben:
// var incoming []byte incoming := make([]byte, 80)
Das obige ist der detaillierte Inhalt vonEmpfangen Sie nur ICMP-Pakete der Länge 0 von icmp.Packetconn. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!