package main import ( "fmt" "net" "os" ) func checkSum(msg []byte) uint16 { sum := 0 len := len(msg) for i := 0; i < len-1; i += 2 { sum += int(msg[i])*256 + int(msg[i+1]) } if len%2 == 1 { sum += int(msg[len-1]) * 256 // notice here, why *256? } sum = (sum >> 16) + (sum & 0xffff) sum += (sum >> 16) var answer uint16 = uint16(^sum) return answer } func checkError(err error) { if err != nil { fmt.Fprint(os.Stderr, "Fatal error:", err.Error()) os.Exit(1) } } func main() { if len(os.Args) != 2 { fmt.Println("Usage: ", os.Args[0], "host") os.Exit(1) } service := os.Args[1] conn, err := net.Dial("ip4:icmp", service) checkError(err) var msg [512]byte msg[0] = 8 msg[1] = 0 msg[2] = 0 msg[3] = 0 msg[4] = 0 msg[5] = 13 msg[6] = 0 msg[7] = 37 msg[8] = 99 len := 9 check := checkSum(msg[0:len]) msg[2] = byte(check >> 8) msg[3] = byte(check & 0xff) fmt.Println(msg[0:len]) _, err = conn.Write(msg[0:len]) checkError(err) _, err = conn.Read(msg[0:]) checkError(err) fmt.Println(msg[0 : 20+len]) fmt.Println("Got response") if msg[20+5] == 13 { fmt.Println("Identifier matches") } if msg[20+7] == 37 { fmt.Println("Sequence matches") } if msg[20+8] == 99 { fmt.Println("Custom data matches") } os.Exit(0) }
有疑问加站长微信联系(非本文作者)