.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 和端口收到答复时,会将此消息转发给客户端。
但是当您使用不同的端口号时,路由器不知道该消息应该发送给谁。
如果可能,我建议第三个连接也由客户端发起,或者数据通过另外两个现有连接之一发送。
我有一个相当复杂的客户端服务器应用程序,它具有三个独立的 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 和端口收到答复时,会将此消息转发给客户端。
但是当您使用不同的端口号时,路由器不知道该消息应该发送给谁。
如果可能,我建议第三个连接也由客户端发起,或者数据通过另外两个现有连接之一发送。