Matlamat utama adalah untuk mengesan port UDP terbuka dengan menghantar data melalui port dan mendengar mesej ICMP yang masuk jika port tidak dapat dicapai. Untuk melakukan ini, gunakan fungsi Go berikut untuk dijalankan sebagai 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) } }
Ini dapat mengesan ping ICMP dan destinasi yang tidak dapat dicapai, tetapi sentiasa mengembalikan mesej 0 panjang. Contoh:
2023/10/11 14:38:32 消息 = '',长度 = 0,源 IP = 127.0.0.1
Saya telah cuba menghuraikan mesej tetapi kerana ia kosong ia mengembalikan ralat masa jalan. Juga, saya memberikan kebenaran root boleh laku, tetapi itu juga tidak berkesan.
EDIT: OS ialah Ubuntu 20.04
Terdapat kesilapan saya sendiri...
Saya cuba membaca daripada penimbal yang tidak dimulakan. Membuat perubahan berikut pada penimbal masuk menyelesaikan isu:
// var incoming []byte incoming := make([]byte, 80)
Atas ialah kandungan terperinci Hanya terima paket ICMP 0-panjang daripada icmp.Packetconn. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!