.NET UDP客户端使用互联网无法正常工作

时间:2018-06-14 18:12:33

标签: c# sockets udp hotspot

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

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

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

现在有第三个连接(端口50003)问题进来。此连接是客户端从服务器接收声音。如果我在局域网上并直接连接到服务器或者我指定了路由器的Internet地址,则此方法有效。但它不适用于热点。

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

这就是代码的工作原理:当从客户端连接到服务器以控制设备时,我获取远程IPEndpoint地址并保存。接下来,我开始使用此地址将UPD数据包从服务器发送到客户端。再一次,这可以通过局域网直接连接到客户端,但如果我使用热点则不起作用。

这是代码:
注意: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数据包发送到启用了端口转发的路由器Internet地址。但是,它不适用于从服务器到客户端的方向。问题是为什么不呢?

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

我应该提到控制连接与以下两者不同:它是异步UDP服务器。

由于

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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