猿问

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

我正在使用 go 创建一个命令行应用程序,该应用程序尝试 ping 给定的主机/IP 地址。我在主函数中使用了以下代码,并在外部进行了必要的导入/变量声明。


package main


import (

    "flag"

    "fmt"

    "net"

    "os"

    "time"


    "golang.org/x/net/icmp"

    "golang.org/x/net/ipv4"

    "golang.org/x/net/ipv6"

)


var icmpType icmp.Type

var isIPv4 = false

var conn *icmp.PacketConn = nil

var start time.Time

var num int


var sequence int


func 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


任何帮助,将不胜感激。谢谢!


一只萌萌小番薯
浏览 171回答 2
2回答

慕哥6287543

无效连接可能是由于您以非特权方式运行程序所致。使用 '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

人到中年有点甜

也许替换你所有的throwError(err)和fmt.Errorf("Error information: %s", err.Error())有关错误发生的确切位置/原因的更多信息。
随时随地看视频慕课网APP

相关分类

Go
我要回答