【发布时间】:2011-11-05 17:04:33
【问题描述】:
我需要建立从我家的计算机到我的办公室计算机的 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)
//...
我能够从我家连接。 (我知道最简单的方法是打开办公室路由器上的端口并将它们转发到我的电脑,问题是我无法访问办公室路由器)
现在他们用更新的路由器替换了我办公室的路由器,我无法使用我的代码。现在,使用新路由器,当我执行我得到的原始代码时:
请注意,映射返回 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
第 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)上侦听,因为所有包都通过端口发送到路由器 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
第 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:
【问题讨论】:
-
这通常不是编码问题,而是管理/策略:在大多数组织中,不允许将内部机器暴露在互联网上。如果您愿意这样做,我建议您以友好的方式直接与网络管理员交谈..
-
是的,如果我联系管理部门,我认为应该获得许可。只是我很好奇,因为我能够使用比特洪流、石灰线和其他 p2p 应用程序。用代码解决这个问题会更好,而不是通过与管理人员交谈,而且我学到了:)
-
这些协议的工作方式不同...谷歌搜索“UDP 打孔进入防火墙”
标签: c# networking tcp portforwarding