You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang使用DialUDP同时收发UDP数据包问题求助

解决UDP数据包发送后无法接收响应的问题

嘿,我一眼就看到你代码里的两个关键问题,咱们一步步来搞定:

1. DialUDP 参数顺序搞反了

net.DialUDP 的函数签名是:

func DialUDP(network string, laddr, raddr *UDPAddr) (*UDPConn, error)

你把**本地地址(lServer)和远程服务器地址(server)**的传参顺序搞反了!这会导致UDP连接的绑定不符合预期,直接影响后续的响应接收。

2. 缺少响应读取逻辑

你的代码只有发送循环,完全没有编写读取服务器响应的代码,自然收不到任何数据。

修正后的完整代码

下面是调整后的代码,我加上了响应读取的逻辑,还修复了参数顺序问题:

if programPacketType == "udp"{
    // 解析远程服务器地址
    server, err := net.ResolveUDPAddr("udp4", programAddressInput)
    checkError(err)
    // 解析本地监听地址(如果不需要指定本地端口,可以传nil让系统自动分配)
    lServer, err := net.ResolveUDPAddr("udp4", programLocalAddressInput)
    checkError(err)
    
    // 修正参数顺序:本地地址在前,远程地址在后
    conn, err := net.DialUDP("udp4", lServer, server)
    checkError(err)
    // 记得退出时关闭连接
    defer conn.Close()

    i := 0
    for {
        msg := strconv.Itoa(i)
        i++
        buf := []byte(msg)
        
        // 发送数据包
        _, err := conn.Write(buf)
        if err != nil {
            fmt.Println("发送失败:", msg, err)
            continue
        }
        fmt.Println("已发送:", i, "到服务器")

        // 准备缓冲区接收响应
        respBuf := make([]byte, 1024)
        // 设置读取超时(可选,避免一直阻塞)
        conn.SetReadDeadline(time.Now().Add(5 * time.Second))
        // 读取服务器响应
        n, remoteAddr, err := conn.ReadFromUDP(respBuf)
        if err != nil {
            if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
                fmt.Println("等待响应超时")
            } else {
                fmt.Println("读取响应失败:", err)
            }
        } else {
            fmt.Printf("收到来自 %s 的响应: %s\n", remoteAddr.String(), string(respBuf[:n]))
        }

        time.Sleep(time.Second * 1)
    }
}

关键说明

  • 参数修正:确保DialUDP的本地地址和远程地址顺序正确,如果你不需要指定本地端口,laddr可以直接传nil,系统会自动分配一个可用端口。
  • 读取逻辑:用ReadFromUDP可以同时获取响应数据和发送方地址,适合UDP这种无连接的协议;也可以用conn.Read(),但ReadFromUDP更直观。
  • 超时设置:添加SetReadDeadline避免程序因为一直等不到响应而永久阻塞,你可以根据需求调整超时时间。

内容的提问来源于stack exchange,提问作者Chiel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:13:04