Golang Go语言中请教在Windows上发送ICMP报文的问题

发布于 1周前 作者 wuwangju 来自 Go语言

Golang Go语言中请教在Windows上发送ICMP报文的问题
如下代码,在 windows 上收不上来 time exceeded 的包,但是 wireshark 上可以抓到。
同样的代码在 linux 上就是好使的。
有没有小伙伴知道是啥原因啊?

https://gist.github.com/goofool/6d69297e1b9e2dadbf8a7df94e14a70d <button onclick="lazyGist(this)"> 显示 Gist 代码 </button>


更多关于Golang Go语言中请教在Windows上发送ICMP报文的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

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/icmpgolang.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报文发送功能。

回到顶部