1

对不起,长篇大论,我试图说得一清二楚。

* 一点背景 *

作为项目的一部分,我们需要能够使用远程桌面 (RDP) 从具有有效 IP 地址的服务器访问某些计算机(以下称为客户端)。这些客户端在 NAT 之后(例如,在 DSL 模式+路由器之后),因此它们没有有效的 IP 地址,但调制解调器+路由器有。假设它们都在 Windows 7 Ultimate 上运行,并且没有防火墙、防病毒软件或任何阻止流量的东西。

* 至今 *

首先想到的也是最合乎逻辑的事情是在调制解调器上使用端口转发选项。但是,这里的真实场景是这些客户端正在运行一个应用程序(它是用 C# 编写的,我们已经提供了),我们需要应用程序来进行端口转发而不是调制解调器,因为在我们部署了系统之后,我们赢得了不知道路由器型号、配置等。此外,我们将无法访问调制解调器设置。因此,假设此选项不可用。

* 对我们来说可行的选择,当然还有问题!*

继续下一个选项,即使用反向隧道(也称为远程端口转发),我们将应用程序更改为创建 2 个套接字。On用于与客户端上的RDP服务器通信,另一个用于连接到服务器(具有有效IP的服务器)以建立隧道。在服务器上有另一个应用程序,它从客户端获取所有流量并将其发送到远程桌面客户端(通过另一个套接字),反之亦然。所以架构看起来像:

|RDP SERVER|<->|Socket1|<->|Socket2|<->The Internet<->|Socket3|<->|Socket4|<->|RDP Client|
------------ Client side ----------                   ------------- Server Side ----------  

Socket 1 位于客户端的 17001 端口,正在与客户端(RDP 服务器)的 3389 端口通信
Socket 2 位于客户端的 17002 端口,正在与服务器的 17002 端口通信
Socket 3 位于服务器的 17002 端口,正在与 17002 端口通信客户端
套接字 4 位于服务器的端口 17002 上,并且正在与服务器的端口 3389 通信(RDP 客户端)

从那时起,每当服务器上的用户想要与 NAT 后面的客户端建立远程桌面连接时,他将连接到套接字 4,所有流量都被重定向到套接字 3,进而将流量转移到套接字 2 和从插座 2 到插座 1,反之亦然。

问题是,无论客户端和服务器如何连接,即使服务器和客户端在同一网络中彼此相邻,在 RDP 询问我客户端的密码后,它会随机执行以下操作之一:1 . 有时它可以毫无问题地连接,我可以与计算机交互 2. 有时它会停在那里 3. 有时它会进入并且在显示客户端屏幕之前它死了。

我检查了连接,改变了调制解调器,改变了客户端和服务器,它仍然是一样的。我什至在客户端( freesshd )上尝试了一个 ssh 服务器并使用 putty 进行远程端口转发,结果是 putty 出现奇怪的错误,导致连接断开。我开始拔头发了!有什么想法吗?

4

1 回答 1

1

首先谢谢大家没有回答我的问题!它帮助我弄清楚出了什么问题。

我想在这里分享解决方案,因此寻找类似问题答案的其他人可能会有所了解。

答案 :

不管你信不信,这和调试有关!!!发布此问题几天后,我发现如果我不调试代码,它就可以正常工作。我的问题解决了,所以我懒得去想原因。

但是,大约三天前,在编写一个必须与用户交互的 Windows 服务的过程中,我不小心碰到了一些文章,这让我明白了哪里出了问题。

我越来越深入地发现,当您开始远程连接时,您实际上是在开始一个新会话。你猜怎么着?您的调试器附加到在另一个 Windows 会话中运行的进程,因此视频渲染器未分配给新会话,所有地狱都会崩溃!

当然,这是我理解的问题,但似乎揭开了谜底!

于 2013-11-07T16:34:54.797 回答