我正在开发一个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抓取返回[]。参见下面的代码: