当我运行此代码时,将读入传入的UDP数据包,但不会发回任何数据包。为什么是这样? (我用wireshark验证了这个事实)。我希望能够通过UDP连接通信两种方式,我如何用golang实现这一点?
//Node 1
func main() {
addr := net.UDPAddr{
Port: 7000,
IP: net.ParseIP("127.0.0.1"),
}
conn, err := net.ListenUDP("udp", &addr)
defer conn.Close()
if err != nil {
panic(err)
}
for {
b := make([]byte, 10)
conn.Read(b)
fmt.Println(string(b[:]))
conn.Write([]byte("sending back"))
}
}
func main() {
sock, _ := net.Dial("udp", "127.0.0.1:7000")
buf := make([]byte, 10)
sock.Write([]byte("first send"))
sock.Read(buf)
fmt.Println(string(buf[:]))
}
答案 0 :(得分:3)
请记住,UDP是无连接的。当您调用conn.Write
时,您的侦听器不知道将数据包发送到何处。在您的服务器代码中,您应该使用UDPConn.ReadFromUDP
和UDPConn.WriteToUDP
来获取并指定客户端地址,如documentation中所述:
返回的连接的ReadFrom和WriteTo方法可用于接收和发送带有每个数据包寻址的UDP数据包。
您修改后的Node 1循环可能如下所示:
for {
b := make([]byte, 10)
n, clientAddr, _ := conn.ReadFromUDP(b) // TODO: error check
fmt.Println(string(b[:n]))
conn.WriteToUDP([]byte("sending back"), clientAddr)
}