我正在使用 go 创建一个命令行应用程序,该应用程序尝试 ping 给定的主机/IP 地址。我在主函数中使用了以下代码,并在外部进行了必要的导入/变量声明。package mainimport ( "flag" "fmt" "net" "os" "time" "golang.org/x/net/icmp" "golang.org/x/net/ipv4" "golang.org/x/net/ipv6")var icmpType icmp.Typevar isIPv4 = falsevar conn *icmp.PacketConn = nilvar start time.Timevar num intvar sequence intfunc throwError(err error) { fmt.Println(err) os.Exit(1)}func main() { host := "google.com" ttl := 64 ipaddr, err := net.ResolveIPAddr("ip", host) if err != nil { throwError(err) } fmt.Println("The host is", host) fmt.Println("Address of processing is", ipaddr) if ipaddr.IP.To4() != nil { conn, err := icmp.ListenPacket("ip4:icmp", "0.0.0.0") if err != nil { throwError(err) } conn.IPv4PacketConn().SetTTL(ttl) isIPv4 = true icmpType = ipv4.ICMPTypeEcho } else { conn, err := icmp.ListenPacket("ip6:ipv6-icmp", "::") if err != nil { throwError(err) } conn.IPv6PacketConn().SetHopLimit(ttl) icmpType = ipv6.ICMPTypeEchoRequest } fmt.Println("isipv4", isIPv4) msg := icmp.Message{ Type: icmpType, Code: 0, Body: &icmp.Echo{ ID: os.Getpid() & 0xffff, Seq: 0, Data: []byte(""), }, } msgBytes, err := msg.Marshal(nil) if err != nil { fmt.Println(err) } _, err = conn.WriteTo(msgBytes, ipaddr) if err != nil { // error occurs inside this block fmt.Println(err) }}具体来说,据我所知,错误发生在我调用该conn.WriteTo函数之后。错误信息是invalid connection任何帮助,将不胜感激。谢谢!
2 回答
慕哥6287543
TA贡献1831条经验 获得超10个赞
无效连接可能是由于您以非特权方式运行程序所致。使用 'ip4:icmp' 和 net.IPAddr 仅在您以特权模式运行程序时才有效,例如使用 sudo。如果你想使用非特权的 ListenPacket,你不能使用 'ip4:icmp' 作为网络,而是使用 'upd4',参见https://godoc.org/golang.org/x/net/icmp#ListenPacket。如果您在 ListenPacket 中使用“udp4”作为网络,您的 WriteTo 必须使用 net.UDPAddr 而不是 net.IPAddr。
像这样: https: //play.golang.org/p/qnxOYbVgk26
人到中年有点甜
TA贡献1895条经验 获得超7个赞
也许替换你所有的
throwError(err)
和
fmt.Errorf("Error information: %s", err.Error())有关错误发生的确切位置/原因的更多信息。
- 2 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消
