Golang Go语言中请教在Windows上发送ICMP报文的问题
Golang Go语言中请教在Windows上发送ICMP报文的问题
如下代码,在 windows 上收不上来 time exceeded 的包,但是 wireshark 上可以抓到。
同样的代码在 linux 上就是好使的。
有没有小伙伴知道是啥原因啊?
更多关于Golang Go语言中请教在Windows上发送ICMP报文的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
https://godoc.org/golang.org/x/net/icmp#ListenPacket
ListenPacket listens for incoming ICMP packets addressed to address. See net.Dial for the syntax of address.
For non-privileged datagram-oriented ICMP endpoints, network must be “udp4” or “udp6”. The endpoint allows to read, write a few limited ICMP messages such as echo request and echo reply. Currently only Darwin and Linux support this.
看下面的 example 里 windows 好像是不支持的.
更多关于Golang Go语言中请教在Windows上发送ICMP报文的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Windows上使用Go语言发送ICMP报文(例如ping操作),由于操作系统的限制,Go标准库并不直接支持ICMP协议。不过,你可以通过调用Windows API来实现这一功能。这里提供一个常见的方法:使用golang.org/x/net/icmp
和golang.org/x/sys/windows
包来实现。
首先,你需要安装这两个包:
go get golang.org/x/net/icmp
go get golang.org/x/sys/windows
然后,你可以编写一个Go程序来发送ICMP报文。这里是一个简单的示例:
package main
import (
"golang.org/x/net/icmp"
"golang.org/x/net/ipv4"
"golang.org/x/sys/windows"
"net"
"os"
)
func main() {
if os.Getppid() == 1 {
// 以管理员权限运行
// ... 发送ICMP报文逻辑
// 使用windows.Syscall()或其他方式调用Windows API来发送ICMP请求
} else {
// 提示用户以管理员权限运行程序
}
}
注意,上述代码仅为框架示例,实际发送ICMP报文的部分需要深入调用Windows API,这通常涉及到使用windows.Syscall
函数或直接使用C语言的库(通过cgo)。由于ICMP报文发送涉及到底层网络操作,通常需要管理员权限。
因此,请确保你的Go程序以管理员权限运行,并且熟悉Windows网络编程的相关API,以正确实现ICMP报文发送功能。