【问题标题】:How to drop a UDP connection between server and client from server side in Golang?如何从 Golang 的服务器端断开服务器和客户端之间的 UDP 连接?
【发布时间】:2022-01-24 14:03:26
【问题描述】:

我正在尝试找到一种标准方法来关闭 UDP 连接中客户端和服务器之间的连接。

目前,我想出了以下解决方案,但是,我不确定这是否是惯用的方式?

基本上我在服务器端(handleClient 函数)所做的是将 nil 写入 UDP 地址的conn.WriteTo(nil, Addr)。在客户端我检查read()函数是否检索到任何数据,如果读取字节数为零,则客户端放弃读取。

if n ==0 || err != nil {
        break
    }

这里是my simplified Server.go 文件:

func handleClient(conn *net.UDPConn) {
    b := make([]byte, 1024)

    n, Addr, err := conn.ReadFrom(b[0:])
    if err != nil {
        panic(err)
    }

    fmt.Println("read: ", n, " bytes", Addr.String())
    // write the data back to the client, just for debug purpose
    conn.WriteTo(b[0:n], Addr)
    // let the client know that server has no more data 
    conn.WriteTo(nil, Addr)
}

还有this is my client.go file

    conn, err := net.Dial("udp", ":14000")
if err != nil {
    panic(err)
}
defer conn.Close()

conn.Write([]byte("I'm client "))

for {
    b := make([]byte, 512)
    n, err := conn.Read(b)
    if n ==0 || err != nil {
        fmt.Println(">", n, err)
        break
    }
    fmt.Println(string(b))
}
fmt.Println("finished.")

【问题讨论】:

    标签: go


    【解决方案1】:

    没有标准的方法来做到这一点。 UDP 是一种无状态协议,因此没有像 TCP 连接那样的“连接”。例如DNS没有状态的概念,客户端发送请求,服务器响应,不维护状态,这通常是UDP的卖点。

    应用程序负责维护状态,因此如果您想要在 UDP 之上的有状态协议,您还必须自己处理关闭此类连接。您可能会从 FTPTFTP 获得灵感来了解如何实现这一点。或者考虑使用TCPQUIC 等有状态传输层协议来为您处理有状态连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-16
      • 2016-09-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多