首页 > 解决方案 > `net.DialUDP` 连接的 `net.Read` 正在接收自己的 `net.Write` 数据

问题描述

我有一个相当复杂的服务器-客户端设置,其中服务器基本上充当两个唯一客户端之间某些数据包的中继。别担心,我做了一个图表,但这里是摘要。

数据包从服务器开始,到达ClientS,然后ClientS将数据包作为响应发送回,然后服务器将其中继到ClientP。然后在收到数据包后,ClientP将不同的数据包发送回服务器,然后它最终中继到ClientS(假设)。

图A

在此处输入图像描述

问题(检查后编辑)

烦人的部分是这只适用于步骤#4。由于某种原因,当服务器net.Write对 UDP 连接进行最终连接时,它以某种方式被拾取,但服务器自己的net.Readfrom #2 而不是net.Readfrom ClientS。另一个图表说明了这个问题。

图B

在此处输入图像描述

代码

就来自服务器的代码而言。我正在做两个net.DialUDP,每个都拨打一个到两个客户端的连接。在该连接“建立”之后,net.Read每个连接上的 goroutine 都会等待。

目前代码有点到处都是,我不想把它全部扔在这里。然而,这里是图表中每个步骤的功能以及我如何拨打 UDP 连接。(显然它不会编译,但也许足以发现一些东西?)

clientSConn, err := net.DialUDP(udpNetwork, localClientSAddress, remoteClientSAddress)
clientSConn.Write(b []byte) (int, error) { … // <------- #1
clientSConn.Read(b []byte) (int, error) { …  // <------- #2
clientSConn.Write(b []byte) (int, error) { … // <------- #5 this byte[] is read by #2 ¯\_(ツ)_/¯

clientPConn, err := net.DialUDP(udpNetwork, localClientPAddress, remoteClientPAddress)
clientPConn.Write(b []byte) (int, error) { … // <------- #3
clientPConn.Read(b []byte) (int, error) { …  // <------- #4

假设/测试

编辑(已解决!)

事实证明,这些问题相当明显且令人尴尬。#5Write没有循环到Read,它只是再次执行 #1 和 #2,因为 #1 和 #5 的连接是相同的。

标签: socketsgoudp

解决方案


推荐阅读