Maison >développement back-end >Golang >Recevez uniquement des paquets ICMP de longueur nulle de icmp.Packetconn
L'objectif principal est de détecter les ports UDP ouverts en envoyant des données via le port et en écoutant les messages ICMP entrants si le port est inaccessible. Pour ce faire, utilisez la fonction Go suivante pour exécuter en tant que goroutine :
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) } }
Ceci est capable de détecter les pings ICMP et l'inaccessibilité de la destination, mais renvoie toujours un message de longueur nulle. Exemple :
2023/10/11 14:38:32 消息 = '',长度 = 0,源 IP = 127.0.0.1
J'ai essayé d'analyser le message mais comme il est vide, il renvoie une erreur d'exécution. De plus, j'ai donné les autorisations root à l'exécutable go, mais cela n'a pas fonctionné non plus.
EDIT : le système d'exploitation est Ubuntu 20.04
J'ai commis ma propre erreur...
J'ai essayé de lire à partir d'un tampon non initialisé. Apporter les modifications suivantes au tampon entrant résout le problème :
// var incoming []byte incoming := make([]byte, 80)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!