golang实现icmp
package main
import ( "fmt" "net" "os" "time" )
func main() { if len(os.Args) != 2 { fmt.Println("Usage: ", os.Args[0], "host") os.Exit(1) }
host := os.Args[1]
conn, err := net.Dial("ip4:icmp", host)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer conn.Close()
var msg [512]byte
msg[0] = 8 // echo
msg[1] = 0 // code
msg[2] = 0 // checksum
msg[3] = 0 // checksum
msg[4] = 0 // identifier[0]
msg[5] = 13 // identifier[1]
msg[6] = 0 // sequence[0]
msg[7] = 37 // sequence[1]
len := 8
check := checkSum(msg[0:len])
msg[2] = byte(check >> 8)
msg[3] = byte(check & 255)
start := time.Now()
conn.SetDeadline(start.Add(time.Second * 5))
_, err = conn.Write(msg[0:len])
if err != nil {
fmt.Println(err)
os.Exit(1)
}
var buf [512]byte
n, err := conn.Read(buf[0:])
if err != nil {
fmt.Println(err)
os.Exit(1)
}
elapsed := time.Since(start)
fmt.Printf("Response from %s:\n", host)
fmt.Printf(" Bytes: %d\n", n)
fmt.Printf(" Time: %v\n", elapsed)
}
func checkSum(msg []byte) uint16 { sum := 0
for n := 1; n < len(msg)-1; n += 2 {
sum += int(msg[n])*256 + int(msg[n+1])
}
sum = (sum >> 16) + (sum & 0xffff)
sum = sum + (sum >> 16)
return uint16(^sum)
}
原文地址: https://www.cveoy.top/t/topic/b4n9 著作权归作者所有。请勿转载和采集!