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

标签 c# sockets udp hotspot

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

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

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

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

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

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

代码如下:
注意: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 地址通常来自私有(private)范围(例如 192.168.x.y),并使用 NA(P)T 转换为热点的公共(public) IP 地址。

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

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

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

关于c# - .NET UDP 客户端在互联网上的使用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863554/

相关文章:

java - 为什么我的 MulticastSocket 只接收每 256 个数据包?

c# - 正确显示ajax error.responseText

c# - (413) WCF 请求实体太大错误

macos - 重启 mosquitto 代理

swift - 如何在 swift 2.0 中将 sockaddr_in 转换为 sockaddr?

java - 基于 Java 的应用程序的发现机制 API

c# - 尝试读取或写入 protected 内存。这通常表示其他内存已损坏 - 在某些 PC 中

c# - 如何使用 Javascript 将控制权转移到 ASPX 页面

sockets - D 中的 MSG_WAITALL 标志

python - Arduino 和 Python 通过 UDP 进行通信