我需要建立从我家的计算机到我的办公室计算机的 tcp 连接。
在办公室有一个路由器,连接了几台计算机。该路由器有互联网,因此连接到该路由器的所有计算机也有互联网。在我的家里,我有一台可以上网的电脑。我需要我的办公室计算机充当服务器,而我的家用计算机则需要连接到它。以前,我曾经能够通过服务器上的端口转发流量进行连接:
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)
//...
我能够从我家连接。(我知道简单的方法是打开办公室路由器上的端口并将它们转发到我的电脑问题是我无法访问办公室路由器)
现在他们用更新的路由器替换了我办公室的路由器,我无法使用我的代码。现在,使用新路由器,当我执行 privious 代码时,我得到:
请注意,映射返回 null;因此,我无法添加映射。
我确信应该有一种方法来建立连接,因为办公室里的一些人使用例如石灰线或比特洪流。我认为我的问题可能与权限有关?我该如何解决这个问题?
编辑
所以从研究中我发现我想做的是“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
第 2 步:现在使用计算机 A 连接到服务器,如下所示:
TcpClient tcpClient = new TcpClient("192.168.11.109", 55550);
第 3 步:在计算机 A 上执行第 2 步代码后,服务器 S 调试应如下所示:
第 4 步:现在我们的目标是从计算机 B 连接到计算机 A。服务器 S 拥有 B 建立连接所需的信息。实际上,我必须在计算机 B 和服务器 S 之间建立连接,以便服务器 S 可以为 B 提供适当的参数,以便 B 连接到 A。
第 5 步:因为我正在调试,所以我现在可以通过侦听端口 3313 使计算机 A 成为服务器。我希望计算机 A 现在在该端口(3313)上侦听,因为所有包都发送到路由器端口 3313 的 X 应发送到计算机 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
第 6 步:所以计算机 A 现在应该在端口 3313 上侦听新连接。再次,端口 3313 很重要,因为路由器 x 应该将从该端口接收到的所有包转发到计算机 A。
计算机 A 正在等待新的连接。
第7步:所以现在快!我们想从计算机 B 建立连接。实际上,服务器 S 将传递参数,但由于我只是想完成这项工作,我将在计算机 B 上快速编写程序。
TcpClient tcpClient = new TcpClient(“192.168.11.108”, 3313);
\\192.168.11.108 is the address of router X
最后:
由于某种原因,计算机 B 无法连接到计算机 A。
它无法连接的原因是因为路由器 X 没有将包转发到计算机 A。(我知道这一点是因为我在路由器 X 上的端口 54540 上启用了端口转发,并且当我使用该端口时它可以工作)我的意思是我不明白为什么路由器 X 没有将来自端口 3313 的流量转发到计算机 A。计算机 A 已经与服务器 S 建立了连接,并且服务器 S 通过端口 3313 发送到路由器 X 的所有内容都发送到了计算机 A。为什么如果我通过端口 3313 将包发送到路由器 X,它们不会被计算机 A 接收!?
PS:
请注意,我在这里展示的所有内容,实际上都有三个路由器 X、Y 和 Z,还有服务器 S、计算机 A 和计算机 B: