手写的 Go ping 实现

举报
Rolle 发表于 2024/10/31 21:52:59 2024/10/31
【摘要】 用 Go 手写一个 Ping 工具引言简介 Ping 工具的历史和作用说明实现该工具的目的ICMP 协议简介ICMP 的基本概念ICMP 报文结构Ping 的工作原理Go 语言与网络编程Go 的网络编程基础使用 net 和 golang.org/x/net/icmp 包实现细节解析命令行参数创建 ICMP 连接发送和接收 ICMP 报文发送 Echo 请求接收 Echo 回复计算往返时间 (...

用 Go 手写一个 Ping 工具

引言
简介 Ping 工具的历史和作用
说明实现该工具的目的
ICMP 协议简介
ICMP 的基本概念
ICMP 报文结构
Ping 的工作原理
Go 语言与网络编程
Go 的网络编程基础
使用 net 和 golang.org/x/net/icmp
实现细节
解析命令行参数
创建 ICMP 连接
发送和接收 ICMP 报文
发送 Echo 请求
接收 Echo 回复
计算往返时间 (RTT)
代码解析
逐行讲解 ping.go 的实现
关键函数的详细说明
运行与测试
如何运行程序
常见错误及解决方法
结果分析与输出示例
扩展与优化
如何增加并发支持
添加更多功能,例如自定义包大小、TTL 等
处理不同操作系统的兼容性
总结
重申 Ping 工具的重要性
鼓励读者探索 Go 语言的网络编程
package main

import (
“fmt”
“net”
“os”
“time”
golang.org/x/net/icmp
golang.org/x/net/ipv4
)

const (
icmpTypeEchoRequest = 8
icmpTypeEchoReply = 0
)

func main() {
if len(os.Args) < 2 {
fmt.Println("Usage: go run ping.go <host>")
return
}
host := os.Args[1]

address, err := net.ResolveIPAddr("ip", host)
if err != nil {
	fmt.Println("ResolveIPAddr failed:", err)
	return
}

conn, err := net.DialIP("ip4:icmp", nil, address)
if err != nil {
	fmt.Println("DialIP failed:", err)
	return
}
defer conn.Close()

for i := 0; i < 4; i++ {
	start := time.Now()
	err = sendICMP(conn, address)
	if err != nil {
		fmt.Println("Send failed:", err)
		return
	}

	err = receiveICMP(conn)
	if err != nil {
		fmt.Println("Receive failed:", err)
		return
	}

	rtt := time.Since(start)
	fmt.Printf("Reply from %s: bytes=32 time=%v\n", host, rtt)
	time.Sleep(1 * time.Second)
}

}

func sendICMP(conn *net.IPConn, address *net.IPAddr) error {
msg := icmp.Message{
Type: ipv4.ICMPTypeEcho, Code: 0,
Body: &icmp.Echo{Seq: 1, ID: 1, Data: []byte(“HELLO”)},
}

data, err := msg.Marshal(nil)
if err != nil {
	return err
}

_, err = conn.WriteTo(data, address)
return err

}

func receiveICMP(conn *net.IPConn) error {
buf := make([]byte, 1500)
conn.SetReadDeadline(time.Now().Add(2 * time.Second))
_, _, err := conn.ReadFrom(buf)
return err
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。