在使用Go语言的net.Dial函数时,发送echo requets报文时,不用考虑i前20个字节的ip头;但是在接收到echo reponse消息时,前20字节是ip头。后面的内容才是icmp的内容,应该与echo request的内容一致。
package main
import (
"flag"
"fmt"
"net"
"os"
"strconv"
"time"
)
func main() {
var count int
var timeout int64
var size int
var neverstop bool
flag.Int64Var(&timeout, "w", 1000, "等待每次回复的超时时间(毫秒)。")
flag.IntVar(&count, "n", 4, "要发送的回显请求数。")
flag.IntVar(&size, "l", 32, "要发送缓冲区大小。")
flag.BoolVar(&neverstop, "t", false, "Ping 指定的主机,直到停止。")
flag.Parse()
args := flag.Args()
if len(args) < 1 {
fmt.Println("Usage: ", os.Args[0], "host")
flag.PrintDefaults()
flag.Usage()
os.Exit(1)
}
ch := make(chan int)
argsmap := map[string]interface{}{}
argsmap["w"] = timeout
argsmap["n"] = count
argsmap["l"] = size
argsmap["t"] = neverstop
for _, host := range args {
go ping(host, ch, argsmap)
}
for i := 0; i < len(args);