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
相关产品推荐
相关产品推荐

