Ton*_*Nam 8 c# networking tcp portforwarding
我需要建立从家用计算机到办公室计算机的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)
//...
Run Code Online (Sandbox Code Playgroud)
我能够从我家连接.(我知道简单的方法是打开办公室路由器上的端口并将它们转发到我的计算机,问题是我无法访问办公室路由器)
现在他们用更新的路由器替换了我办公室的路由器而且我无法使用我的代码.现在,使用新的路由器,当我执行我得到的私密代码时:
请注意,映射返回null; 因此,我无法添加映射.
我确信应该有办法建立连接,因为办公室里的某些人使用limewire或比特洪流.我认为我的问题可能与权限有关吗?我该如何解决这个问题?
.
.
.
.
.
.
好的,所以我相信我已经尝试用c#做你们在这个问题上发布的内容:好吧,让我告诉你我做了什么:
请注意,您可能需要参考此图表以了解我将要解释的内容:
如你所知,我想在计算机A和计算机B之间建立一个tcp连接.我设法做到这一点的方法是做一个所谓的tcp punch holing.
第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
Run Code Online (Sandbox Code Playgroud)
第2步:现在使用计算机A连接到服务器:
TcpClient tcpClient = new TcpClient("192.168.11.109", 55550);
Run Code Online (Sandbox Code Playgroud)
步骤3:在计算机A上执行第2步代码后,服务器S debug应如下所示:
步骤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
Run Code Online (Sandbox Code Playgroud)
步骤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
Run Code Online (Sandbox Code Playgroud)
最后:
由于某种原因,计算机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:
您的新工作路由器可能已被UPnP
禁用,因此您的引用为空。
如果没有这个,您的服务器将无法对入站流量可见,因为路由器不知道将入站数据包发送到哪里。在这种情况下,路由器充当防火墙,阻止传入服务器的流量。
解决这个问题的基本方法是:
1)开启UPnP
这使您的应用程序能够指示路由器如何将入站流量转发回您的服务器。
2)设置端口转发
如上通过手动配置路由器。
3)让你的工作服务器成为客户端
路由器通过允许出站连接来启动连接来工作。它会记住返回地址,重写外部可见的 IP,并为外部流量提供未使用的端口进行回话 (NAT)。这允许出站请求与外部建立通信并绕过防火墙。如果您的家庭 IP 是固定的,您可以在工作中设置一个客户端,尝试按计划打电话回家(直到您启动服务器并可以建立连接)。
4)使用P2P(中介服务器)
我不知道你会从哪里开始,但原则是这样的。它通常工作在单个 UDP 端口上。使用不在 NAT 之后的服务器来建立连接。客户端在 UDP 数据包中将其 IP 发送到服务器,路由器用路由器返回地址重写 UDP 标头。服务器获取此数据并将其发送给其他对等点。现在每个人都知道彼此的返回地址,他们可以直接向彼此发送 TCP 流量,并且服务器会避开。
这里有一些关于 NAT 基础知识的非常好的文章,用简单的术语进行了解释。这里有一篇很好的文章解释了 P2P 如何利用 NAT 绕过防火墙。
希望这能给你一些想法。
归档时间: |
|
查看次数: |
3840 次 |
最近记录: |