当前位置: 首页 > 面试题库 >

无法读取UDP回复(golang)

顾永福
2023-03-14
问题内容

我正在开发一个Go程序,该程序发出UDP广播以查询本地网络上设备的存在,然后读取答复。使用Wireshark,我确认该数据包已广播,并且(我)网络上的单个设备已答复(实际上是10次),但我的应用程序在读取时被阻止,好像它看不到传入的数据包。这是代码:

func Discover(timeout int) ([]string, error) {
    inBuf := make([]byte, 1024)
    devices := make([]string, 0)
    var readLen int
    var fromAddr *net.UDPAddr

    // get server connection
    server := fmt.Sprintf("%s:%d", bcastIP, udpDiscoverPort) // "255.255.255.255", 10000
    serverAddr, err = net.ResolveUDPAddr("udp", server)
    checkErr(err)
    ourAddr, err = net.ResolveUDPAddr("udp", "192.168.1.132:10000")
    checkErr(err)
    conn, err = net.DialUDP("udp", ourAddr, serverAddr)
    checkErr(err)
    defer conn.Close()

    // send the Discover message
    discoverMsg := []byte(magic)
    discoverMsg = append(discoverMsg, discovery...)
    sendLen, err := conn.Write(discoverMsg)
    checkErr(err)
    fmt.Println("Sent", sendLen, "bytes")

    // read one reply
    readLen, fromAddr, err = conn.ReadFromUDP(inBuf)
    fmt.Println("Read ", readLen, "bytesfrom ", fromAddr)
    txtutil.Dump(string(inBuf[:readLen]))
    return devices, nil
}

checkErr(err)打印诊断信息,如果err不为零,则退出。

答复中的信息如下:

Internet Protocol Version 4, Src: 192.168.1.126 (192.168.1.126), Dst: 192.168.1.132 (192.168.1.132)
User Datagram Protocol, Src Port: ndmp (10000), Dst Port: ndmp (10000)

我尝试用“ 0.0.0.0:10000”、“:10000”和“ 127.0.0.1:10000”代替“
192.168.1.132:10000”,但似乎没有任何区别。

任何关于我做错事情的建议都欢迎!


问题答案:

您需要使用ListenUDP而不是DialUDP。当您使用时DialUDP,它将创建一个“已连接”的UDP端口,并且仅在读取时返回源自远程地址的数据包。

conn, err = net.ListenUDP("udp", ourAddr)

由于连接没有默认目的地,因此您还需要使用WriteTo*方法发送数据包:

sendLen, err := conn.WriteToUDP(discoverMsg, serverAddr)


 类似资料:
  • 以前的代码是用c语言编写的,使用的是这样的代码: 这段代码可以工作,但我必须使用Netty在java中重新实现它。 在tcp中使用netty不是问题,但是用netty回复客户机对我来说是个问题,如果我想在通道上写,它失败了,出现了。 也许这与netty上的这个问题有关,但我不知道如何在代码中再现c行为。 如何回复客户? 多谢了。 编码器代码:

  • 我编写了以下代码: 我的终端支持Unicode,在Linux上使用gcc 8.2.1编译。

  • TypeError:无法读取应用程序上未定义的属性“collection”。在图层上发布(/home/niko/Desktop/opa/app.js:17:38)。在route的下一个(/home/niko/Desktop/opa/node_modules/express/lib/router/layer.js:95:5)中处理[as handle_request](/home/niko/Desk

  • 我已经按照下面的链接使用spring的Swagger为我的REST服务创建API文档。 http://jakubstas.com/spring-jersey-swagger-configuration/#comment-1726 一切都很顺利,但当我试图使用url http://localhost:8080/rest/api-docs访问swagger的api文档时,我发现无法读取swagger

  • 我知道有类似的线程讨论范围问题。 使用以下组件 当您单击时,您会得到的属性'setState' 我知道你可以像这样做,但所有这些看起来都很奇怪,只是为了让它工作。 什么被认为是最优雅的方式来做到这一点?当然,人们必须有一个首选的方式,除了眼睛疼痛之外,还有其他好处?

  • 由于某种原因,当我试图读取xpath时,web抓取返回[]。参见下面的代码: