.NET UDP 客户端在互联网上的使用不起作用

.NET UDP Client use over internet not working

我有一个相当复杂的客户端服务器应用程序,它具有三个独立的 UDP 连接。

一个连接(端口50001)用于控制一个设备。 此连接侦听来自远程设备的连接,并在建立连接时发送和接收数据。这在 LAN 和 Internet 上都可以正常工作。当然,在服务器网络上启用了端口转发。这也适用于移动 phone 热点。

另一个连接用于将 UDP 声音从客户端发送到服务器(端口 50002)。在这种情况下,客户端只是使用路由器的互联网 IP 地址将 UDP 数据包发送到服务器,然后通过端口转发到达服务器。这在 LAN 和使用移动 phone 热点的 Internet 上运行良好。

现在出现问题的是第三个连接(端口 50003)in.This连接是客户端从服务器接收声音。如果我在 LAN 上并直接连接到服务器,或者如果我指定路由器的 Internet 地址,这将起作用。但它不适用于热点。

所以问题是,这是移动提供商的问题,只是不允许 UDP 数据包通过端口 50003 进入吗?或者,我没有正确连接到热点?

所以代码是这样工作的:当从客户端建立连接到服务器以控制设备时,我获取远程 IPEndpoint 地址并保存它。接下来,我开始使用这个地址从服务器向客户端发送 UPD 数据包。同样,这可以通过 LAN 直接连接到客户端,但如果我使用热点,它就不起作用。

代码如下:
Note:address 包含来自第一个连接的远程客户端的地址:

private void Connect(string address, int port) //at this point the control connection is running and the address comes from there
{
    IPAddress destination = IPAddress.Parse(address)
    socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 
    endPoint = new IPEndPoint(destination, port);
}

private void SendBytes(Byte[] bytes)
{
    socket.SendTo(bytes, 0 , bytes.,Length, SocketFlags.None, endPoint)
}

所以这个完全相同的代码在从客户端到服务器的方向上工作,但在那种情况下,我将 UDP 数据包发送到启用了端口转发的路由器互联网地址。但是,它在从服务器到客户端的方向上不起作用。问题是为什么不呢?

是不是热点没有端口转发? 为什么控件不需要一个(连接一个??)。

我应该提到控制连接不同于这两个:它是一个异步 UDP 服务器。

谢谢

您认为问题出在热点端口转发缺失的假设是正确的。

热点提供的 IP 地址通常来自私有范围(例如 192.168.x.y),并使用 NA(P)T 转换为热点的 public IP 地址现货.

当您从客户端向服务器发送UDP 消息时,热点中的路由器会保留源和目标IP 地址和端口的信息。当使用相同的 IP 和端口收到答复时,会将此消息转发给客户端。

但是当您使用不同的端口号时,路由器不知道该消息应该发送给谁。

如果可能,我建议第三个连接也由客户端发起,或者数据通过另外两个现有连接之一发送。