我有一个相当复杂的客户机-服务器应用程序,它有三个独立的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服务器。
谢谢