golang实现ping
以下是使用Golang实现ping的示例代码:
package main
import (
"fmt"
"net"
"os"
"time"
)
func main() {
if len(os.Args) != 2 {
fmt.Println("Usage: go run ping.go <host>")
os.Exit(1)
}
host := os.Args[1]
addr, err := net.ResolveIPAddr("ip4", host)
if err != nil {
fmt.Println("Error resolving host:", err)
os.Exit(1)
}
conn, err := net.DialIP("ip4:icmp", nil, addr)
if err != nil {
fmt.Println("Error connecting to host:", err)
os.Exit(1)
}
defer conn.Close()
seq := 1
for {
start := time.Now()
msg := make([]byte, 64)
msg[0] = 8 // echo
msg[1] = 0 // code
msg[2] = 0 // checksum
msg[3] = 0 // checksum
msg[4] = byte(seq) // identifier
msg[5] = 0 // identifier
msg[6] = 0 // sequence number
msg[7] = 0 // sequence number
check := checkSum(msg)
msg[2] = byte(check >> 8)
msg[3] = byte(check & 255)
conn.SetDeadline(time.Now().Add(time.Second))
_, err := conn.Write(msg)
if err != nil {
fmt.Println("Error sending ping:", err)
os.Exit(1)
}
reply := make([]byte, 64)
_, err = conn.Read(reply)
if err != nil {
fmt.Println("Error receiving ping reply:", err)
os.Exit(1)
}
elapsed := time.Since(start)
fmt.Printf("Ping reply from %s seq=%d time=%v\n", addr.String(), seq, elapsed)
time.Sleep(time.Second)
seq++
}
}
func checkSum(msg []byte) uint16 {
sum := uint32(0)
for i := 0; i < len(msg)-1; i += 2 {
sum += uint32(msg[i+1])<<8 | uint32(msg[i])
}
if len(msg)%2 == 1 {
sum += uint32(msg[len(msg)-1])
}
sum = (sum >> 16) + (sum & 0xffff)
sum += sum >> 16
return ^uint16(sum)
}
该程序实现了使用ICMP协议向指定主机发送ping并接收回复。程序首先解析传入的主机名,然后使用DialIP函数连接到主机。在循环中,程序构造一个ICMP消息并发送到主机,然后等待主机的回复。程序在每次收到回复时计算延迟并打印出来,然后等待一秒钟并发送下一个ping。checkSum函数用于计算ICMP消息的校验和。
原文地址: https://www.cveoy.top/t/topic/sE8 著作权归作者所有。请勿转载和采集!