go - 无法读取 UDP 回复(golang)

标签 go udp

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

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)

关于go - 无法读取 UDP 回复(golang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40897417/

相关文章:

go - 解决非主包中的相对路径问题

dictionary - 解码到 map 中

eclipse - 如何使用 GoClipse 在 Eclipse Neon 中创建断点?

c++ - 使用 QUdpSocket 作为 QIODevice 的正确方法是什么?

c - Linux 上的 UDP connect() 和 recv()

performance - 为什么 UDP 最大带宽的 iperf 测量值总是相同的?

go - 将结构数组传递给 Go 中的函数

php - 将 cookie curl 到 Golang HTTP 请求

ffmpeg - 如何摆脱 ffmpeg 中的错误 "jitter buffer full"?

linux - 套接字接收队列中有多少数据包或字节?