我正在开发一个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不是nil,BTW。
回复中的信息如下:
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"似乎没有任何区别。
欢迎任何关于我做错的建议!
答案 0 :(得分:1)
您需要使用ListenUDP
代替DialUDP
。当您使用DialUDP
时,它会创建一个“已连接”的UDP端口,并且只有在读取时才会返回源自远程地址的数据包。
conn, err = net.ListenUDP("udp", ourAddr)
由于连接没有默认目标,因此您还需要使用WriteTo*
方法发送数据包:
sendLen, err := conn.WriteToUDP(discoverMsg, serverAddr)