sockets - `net.DialUDP` 连接的 `net.Read` 正在接收自己的 `net.Write` 数据
问题描述
我有一个相当复杂的服务器-客户端设置,其中服务器基本上充当两个唯一客户端之间某些数据包的中继。别担心,我做了一个图表,但这里是摘要。
数据包从服务器开始,到达ClientS
,然后ClientS
将数据包作为响应发送回,然后服务器将其中继到ClientP
。然后在收到数据包后,ClientP
将不同的数据包发送回服务器,然后它最终中继到ClientS
(假设)。
图A
问题(检查后编辑)
烦人的部分是这只适用于步骤#4。由于某种原因,当服务器net.Write
对 UDP 连接进行最终连接时,它以某种方式被拾取,但服务器自己的net.Read
from #2 而不是net.Read
from 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
假设/测试
- 当我从本地拨号到远程地址并进行写入时,数据只能发送到给拨号的远程地址。与读取相同,数据只能来自拨号连接的远程地址。
- 我开始使用这个项目
net.Listen
,它给了我很多奇怪的结果。net.Dial
最终解决了我最初的大部分问题。也许我仍然很困惑有什么区别? - 我尝试了
net.ReadFrom
andnet.ReadFromUDP
,但两者都给了我相同的结果net.Read
。 - 我试过
net.WriteTo
andnet.WriteToUDP
,但都没有向客户发送任何数据。
编辑(已解决!)
事实证明,这些问题相当明显且令人尴尬。#5Write
没有循环到Read
,它只是再次执行 #1 和 #2,因为 #1 和 #5 的连接是相同的。
解决方案
推荐阅读
- azure - 有没有办法使用 GCP 资源将数据从 Google Cloud Storage 传输到 Azure Blob Storage?
- python - 我可以自动获取 XML 文件的名称空间吗?
- r - 如何在 R 中操作数据?
- java - 如何在java中拆分文件名字符串
- azure - Azure 中的 CI/CD 触发发布到基于分支代码的环境已签入
- git - 谁是“git revert”中的“他们”和“我们”?
- javascript - 在接受参数的函数内部循环
- docker - 无法连接到在 docker 中运行的本地 datastax cassandra
- python - 如何在 wagtail 管理员中过滤页面列表,以便编辑者只能看到其中一部分组中的页面?
- ios - 如何将自定义 SCNTechnique 传递添加到特定区域,而不会弄乱 Sceneview 全屏区域的其余部分?