Golang中UDP通信问题求助

Golang中UDP通信问题求助 你好,

我正在尝试使用UDP连接一个设备。设备文档说明,我必须通过UDP端口4113发送广播命令,并监听UDP端口4114上的回复。

当我使用Linux的nc命令测试我的代码时,我收到以下错误信息:

invalid connection to [192.168.0.145] from (UNKNOWN) [192.168.0.100] 4114

我的代码:

	command := []byte("%US1975**\r\n")
	///
	//
	//
	listenAddr, err := net.ResolveUDPAddr("udp4", "192.168.0.100:4114")
	if err != nil {
		return err
	}
	list, err := net.ListenUDP("udp4", listenAddr)
	if err != nil {
		return err
	}
	defer list.Close()

	addr, err := net.ResolveUDPAddr("udp4", "192.168.0.255:4113")
	if err != nil {
		return err
	}

	_, err = list.WriteTo(command, addr)
	if err != nil {
		return err
	}

	reply := make([]byte, 236)
	_, addrDevice, err := list.ReadFromUDP(reply)
	if err != nil {
		return err
	}
	fmt.Print("Device IP: ")
	fmt.Println(addrDevice.IP.String())
	fmt.Println("===================================================================")
	fmt.Println(string(reply))
	fmt.Println("===================================================================")


更多关于Golang中UDP通信问题求助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中UDP通信问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个典型的UDP广播通信问题。错误信息表明连接配置有问题。以下是修正后的代码:

package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    command := []byte("%US1975**\r\n")
    
    // 创建发送广播的socket
    broadcastAddr, err := net.ResolveUDPAddr("udp4", "192.168.0.255:4113")
    if err != nil {
        panic(err)
    }
    
    // 创建监听回复的socket
    listenAddr, err := net.ResolveUDPAddr("udp4", ":4114")
    if err != nil {
        panic(err)
    }
    
    // 监听端口4114
    listenConn, err := net.ListenUDP("udp4", listenAddr)
    if err != nil {
        panic(err)
    }
    defer listenConn.Close()
    
    // 创建发送广播的临时socket
    sendConn, err := net.DialUDP("udp4", nil, broadcastAddr)
    if err != nil {
        panic(err)
    }
    defer sendConn.Close()
    
    // 发送广播命令
    _, err = sendConn.Write(command)
    if err != nil {
        panic(err)
    }
    
    // 设置读取超时
    listenConn.SetReadDeadline(time.Now().Add(5 * time.Second))
    
    // 读取回复
    reply := make([]byte, 236)
    n, addrDevice, err := listenConn.ReadFromUDP(reply)
    if err != nil {
        panic(err)
    }
    
    fmt.Printf("Device IP: %s\n", addrDevice.IP.String())
    fmt.Println("===================================================================")
    fmt.Println(string(reply[:n]))
    fmt.Println("===================================================================")
}

关键修改点:

  1. 使用两个独立的UDP连接:一个用于发送广播(端口4113),一个用于接收回复(端口4114)
  2. 简化监听地址:监听时使用:4114而不是指定具体IP,让系统自动绑定
  3. 添加超时处理:避免ReadFromUDP无限期等待
  4. 正确使用读取的字节数ReadFromUDP返回实际读取的字节数

如果设备需要特定的源端口,可以这样修改发送部分:

// 指定源端口发送
localSendAddr, _ := net.ResolveUDPAddr("udp4", ":0") // 0表示随机端口
sendConn, err := net.ListenUDP("udp4", localSendAddr)
if err != nil {
    panic(err)
}
defer sendConn.Close()

// 发送到广播地址
_, err = sendConn.WriteToUDP(command, broadcastAddr)
if err != nil {
    panic(err)
}

这样配置后,UDP通信应该能正常工作。

回到顶部