Maison >développement back-end >Golang >Recevez uniquement des paquets ICMP de longueur nulle de icmp.Packetconn

Recevez uniquement des paquets ICMP de longueur nulle de icmp.Packetconn

WBOY
WBOYavant
2024-02-05 21:24:041240parcourir

仅从 icmp.Packetconn 接收 0 长度的 ICMP 数据包

Contenu de la question

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


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer