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)

}

golang实现icmp

原文地址: https://www.cveoy.top/t/topic/b4n9 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录