ListenUDP,一条单行道?

时间:2014-11-27 19:26:44

标签: go udp

当我运行此代码时,将读入传入的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[:]))
}

1 个答案:

答案 0 :(得分:3)

请记住,UDP是无连接的。当您调用conn.Write时,您的侦听器不知道将数据包发送到何处。在您的服务器代码中,您应该使用UDPConn.ReadFromUDPUDPConn.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)
}