带有客户端和服务器的 Golang 应用程序。
服务器使用 net.ListenUDP - 客户端也使用 net.ListenUDP,连接到服务器并使用 conn.WriteToUDP 和服务器地址发送数据包。
服务器接收带有 ReadFromUDP 的数据包并获取返回地址。然后,它使用此返回地址将大量数据包发送回客户端。
当在本地计算机上运行客户端和服务器时,这工作得很好。使用 Wireshark,我可以检查 UDP 数据包并查看它们包含源端口和目标端口 - 在应用程序中,我可以看到它们到达,并且我的各种校验和测试显示数据是准确的。
然后我将服务器移离现场到远程计算机。应用程序停止工作。我可以成功地将第一条消息从客户端发送到服务器 - 接收得很好。服务器将响应“发送回”客户端 - 但客户端永远不会收到它们。
使用 Wireshark,我可以看到数据包确实以正确的 IP 地址返回到本地计算机。看来我的网络路由器已对传出数据包执行了 NAT - 并已正确地将响应数据包重新寻址到内部 IP。但是没有端口。
所以我有 UDP 数据包到达正确的机器,但没有端口 - 所以客户端应用程序不会收到它们。应用程序在 ReadFromUDP 上超时。
我不知道这是否相关,但在本地计算机上,Wireshark 将数据包标记为 BT-uTP Utorrent 数据包。当它们从远程服务器进入时,这就是我在 Wireshark 中看到的 - 请注意缺少端口。
有什么想法我可以解决这个问题。我不认为这是一个 UDP 打洞问题,因为虽然我是通过 NAT 建立连接,但它是与服务器而不是对等点建立连接。
慕桂英3389331
相关分类