代码之家  ›  专栏  ›  技术社区  ›  Tom

.NET UDP客户端在Internet上的使用不起作用

  •  2
  • Tom  · 技术社区  · 6 年前

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

    一个连接(端口50001)用于控制设备。 这个连接监听来自远程设备的连接,当建立连接时,发送数据和接收数据。这在局域网和互联网上都可以正常工作。当然,在服务器网络上启用了端口转发。使用手机热点也可以。

    另一个连接用于将UDP声音从客户端发送到服务器(端口50002)。在这种情况下,客户端只使用路由器的Internet IP地址向服务器发送UDP数据包,然后通过端口转发将其发送到服务器。这在局域网和使用移动电话热点的互联网上都可以正常工作。

    现在有第三个连接(端口50003)出现问题。这个连接是客户端从服务器接收声音。如果我在局域网上并直接连接到服务器,或者指定路由器的Internet地址,这就可以工作。但它不适用于热点。

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

    代码就是这样工作的:当从客户机到服务器进行连接以控制设备时,我得到远程ipendpoint地址并保存它。接下来,我开始使用这个地址将upd包从服务器发送到客户机。同样,这可以通过局域网直接连接到客户机,但如果我使用热点,它就不起作用。

    代码如下:
    注意:地址包含第一个连接的远程客户端地址:

    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包发送到启用了端口转发的路由器Internet地址。但是,它不能在从服务器到客户机的方向上工作。问题是为什么不呢?

    是因为热点上没有可用的端口转发吗? 为什么控制不需要一个(连接一个)??)。

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

    谢谢

    1 回复  |  直到 6 年前
        1
  •  2
  •   Roland Bär    6 年前

    您认为问题出在丢失的港口上的转发热点是正确的。

    热点提供的IP地址通常来自专用范围(例如192.168.x.y),并用na(p)t转换为热点的公共IP地址。

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

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

    如果可能的话,我建议第三个连接也由客户机启动,或者通过其他两个现有连接之一发送数据。