go - 为什么我的 UDP 拨号器没有监听?

标签 go udp

我有两个程序,一个监听器和一个拨号器。我想要同一端口上的双向 UDP 通信。 我的监听器按预期读取从拨号器发送的数据报,然后发回它自己的 5 个数据报。唯一的问题是,我的拨号器没有读取它。

我尝试使用 net.DialUDP,但是当我使用它时,从拨号器发送了 0 个数据报。

listener - 效果很好

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)
}

i := 0

b := make([]byte, 10)
conn.ReadFromUDP(b)
fmt.Println(string(b[:]))
for i < 5 {

    conn.WriteToUDP([]byte("sending back"), &addr)
    i++
}
}

拨号器发送数据报但不能读取它们

func main() {
sock, _ := net.Dial("udp", "127.0.0.1:7000")
buf := make([]byte, 100)

_, werr := sock.Write([]byte("first send"))
if werr != nil {
    fmt.Println(werr)
}
sock.Read(buf)

fmt.Println(string(buf[:]))
}

不发送任何数据报的拨号器

func main() {

remote, _ := net.ResolveUDPAddr("udp", "127.0.0.1:7000")
sock, _ := net.DialUDP("udp", nil, remote)

buf := make([]byte, 10)

for {
    sock.WriteToUDP([]byte("first send"), remote)
    sock.ReadFromUDP(buf)
    fmt.Println(string(buf[:]))

}
}

最佳答案

如有疑问,请使用 ListenUDP。它将发送和接收数据报。

sock, _ := net.Dial("udp", "127.0.0.1:7000")

这会创建一个net.Conn,它只是一个基本的连接接口(interface)。您必须将其断言为 *net.UDPConn 才能使实际的 UDP 方法起作用。

sock, _ := net.DialUDP("udp", nil, remote)

这会创建一个“连接的”UDP 套接字,并使用裸Write 方法发送到单个远程地址。

关于go - 为什么我的 UDP 拨号器没有监听?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27180293/

相关文章:

php - 为什么 TCP 工作,而 UDP 不工作?

javascript - WebRTC 数据通道服务器到客户端的 UDP 通信

go - 从不同的包导入原始文件会导致 'missing method protoreflect'

go - 使用 go sql 时,在每种类型中重写 Scan 和 Value 方法时避免重复代码

multithreading - 戈朗 : can WaitGroup leak with go-routines

java - 如何用java代码区分机器中的TCP和UDP数据包?

c# - 从 UDP 连接 C# 获取客户端 ip

sockets - C++ Winsock 非阻塞/异步 UDP 套接字

go - 在繁忙循环的 goroutine 中休眠

http - 输入 TYPE TEXT 值形式 (enctype =“multipart/form-data” ) 返回 null