我需要从家里的电脑与办公室的电脑建立TCP连接。在办公室里有一个路由器,连接着几台电脑。该路由器有互联网连接,因此连接到该路由器的所有电脑都可以上网。我家里有一台有互联网接入的电脑。我需要让我的办公室电脑充当服务器,而我的家庭电脑则连接到它。以前,我可以通过在服务器上端口转发流量来进行连接:
步骤二: 现在用A电脑连接到服务器,方法如下:
第三步: 在电脑A上执行第二步代码后,服务器S的调试结果应该如下图所示:
第四步:
现在我们的目标是从电脑B连接到电脑A。服务器S拥有B需要建立连接所需的信息。实际上,我需要在电脑B和服务器S之间建立连接,这样服务器S才能提供B所需的参数,以便B连接到A。
第五步: 由于我正在进行调试,所以我能够看到这些参数,因此我现在将电脑A设为服务器,监听端口3313。我希望电脑A现在可以在该端口(3313)上监听,因为所有发送到路由器X的使用端口3313的数据包都应该被发送到电脑A。
步骤六: 现在,计算机A应该在3313端口上等待新连接。重要的是3313端口,因为路由器X应该将从该端口接收到的所有数据包转发到计算机A上。
计算机A正在等待新连接。
步骤七:
现在快速行动!我们希望从计算机B建立连接。实际上,服务器S将传递参数,但由于我只是尝试让这个工作起来,所以我将在计算机B上快速编写程序。
NATUPNPLib.UPnPNATClass upnpnat;
NATUPNPLib.IStaticPortMappingCollection mappings;
public ServerExample()
{
InitializeComponent();
upnpnat = new NATUPNPLib.UPnPNATClass();
mappings = upnpnat.StaticPortMappingCollection;
// server local IP address
mappings.Add(1300, "TCP", 1300, "192.168.150.146", true, "plsease work");
// this code tels the router to forward all tcp traffic comming from port
// 1300 to the server computer (it's lan ip address happens to be 192.168.150.146)
//...
我曾经可以从家里连接。 (我知道简单的方法是在办公室路由器上打开端口并将它们转发到我的计算机,但问题是我无法访问办公室路由器)
现在他们用新的路由器替换了我的办公室路由器,我无法使用我的代码。现在,使用新路由器时,当我执行以前的代码时,我会得到:
请注意,映射返回null; 因此,我无法添加映射。
我确定应该有一种建立连接的方法,因为办公室中的某些人例如使用limewire或bit torrent。 我认为我的问题可能与权限有关? 我如何解决这个问题?
编辑
通过研究,我发现我要做的是“防火墙UDP穿透”。实际上,我想通过tcp连接做到这一点。我不知道TCP和UPD puch holing之间的区别...我的意思是为了客户端能够在不必在路由器上进行配置的情况下找到一个对等体。
.
.
.
.
.
.
更新
好的,所以我相信我已经尝试使用c#对这个问题进行了发帖:好的,让我向你展示我的操作:
请注意,您可能需要参考此图以便理解我将要解释的内容:
正如您所知,我想在计算机A和计算机B之间建立TCP连接。我设法做到这一点是通过所谓的TCP穿透。
第1步: 首先,我在服务器S上开始侦听新连接。
TcpListener server = new TcpListener(System.Net.IPAddress.Parse(“192.168.11.109”), 55550);
Server.Start();
var client = server.AcceptSocket(); \\ wait here until someone connects
步骤二: 现在用A电脑连接到服务器,方法如下:
TcpClient tcpClient = new TcpClient("192.168.11.109", 55550);
第三步: 在电脑A上执行第二步代码后,服务器S的调试结果应该如下图所示:
![enter image description here](https://istack.dev59.com/V21Em.webp)
第五步: 由于我正在进行调试,所以我能够看到这些参数,因此我现在将电脑A设为服务器,监听端口3313。我希望电脑A现在可以在该端口(3313)上监听,因为所有发送到路由器X的使用端口3313的数据包都应该被发送到电脑A。
\\ COMPUTER A
TcpListener server = new TcpListener(System.Net.IPAddress.Parse("192.168.0.120"), 3313);
server.Start();
var newClient = server.AcceptSocket(); \\ wait here until a client gets connected
步骤六: 现在,计算机A应该在3313端口上等待新连接。重要的是3313端口,因为路由器X应该将从该端口接收到的所有数据包转发到计算机A上。
计算机A正在等待新连接。
![enter image description here](https://istack.dev59.com/som7E.webp)
TcpClient tcpClient = new TcpClient(“192.168.11.108”, 3313);
\\192.168.11.108 is the address of router X
最后:
由于路由器X没有将数据包转发到计算机A,因此计算机B无法连接到计算机A。(我知道这是因为我在路由器X上启用了端口转发功能,并且当我使用该端口时它能够正常工作)我的意思是,我不明白为什么路由器X没有将从端口3313发送来的流量转发到计算机A。计算机A已经与服务器S建立了连接,所有通过端口3313向路由器X发送给服务器S的内容都已被发送到计算机A。那么,如果我通过端口3313向路由器X发送数据包,为什么计算机A不能接收到呢?
注:
请注意,我展示的所有内容实际上都涉及三个路由器X、Y和Z,以及服务器S、计算机A和计算机B: