为了账号安全,请及时绑定邮箱和手机立即绑定

尝试发出回显请求时出现无效连接错误

尝试发出回显请求时出现无效连接错误

Go
一只萌萌小番薯 2022-06-01 10:05:18
我正在使用 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


查看完整回答
反对 回复 2022-06-01
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

也许替换你所有的

throwError(err)

fmt.Errorf("Error information: %s", err.Error())

有关错误发生的确切位置/原因的更多信息。


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号