【发布时间】:2014-12-28 22:21:06
【问题描述】:
问题如下。这是我当前没有成功的测试代码。
static void Main(string[] args)
{
if (args.Count() != 3)
{
Console.WriteLine("Bad args");
}
var ep = new IPEndPoint(IPAddress.Parse(args[0]), int.Parse(args[1]));
var lp = new IPEndPoint(IPAddress.Any, int.Parse(args[2]));
var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
s.Bind(lp);
var c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
c.Bind(lp);
Task.Run(() => { try { c.Connect(ep); } catch { } });
s.Listen(10);
var v = s.Accept();
v.Close();
}
如何进行 TCP 打孔?我正在使用远程服务器进行测试。我正在运行wget local_public_ip:port/test。我的路由器设置为端口 80,因此不需要打孔。我的代码建立了联系。现在我尝试了其他端口,但我无法完全弄清楚如何打孔。
我所做的是(C#代码)
var l = new TcpListener(8090);
l.Start();
try { var o = new TcpClient(); o.Connect("myserverip", 123); }
catch(Exception ex) {}
var e = l.AcceptSocket();
Console.WriteLine(e.RemoteEndPoint.AddressFamily);
我想也许我需要在 out tcp 连接上设置本地端点。
TcpClient(new System.Net.IPEndPoint(new System.Net.IPAddress(bytearray), port));
我犯了一个错误,得到了这个异常
The requested address is not valid in its context
将字节数组修复为192,168,1,5 似乎使传出连接正确。现在我已经使用我的侦听端口与远程 IP 建立了连接,我认为 wget 能够连接到我。事实并非如此
如何进行 TCP 打孔?
【问题讨论】:
-
你把
o的本地端口设置为8090了吗?您谈论它,但代码不匹配。请更新代码。;删除所有未定义的变量,例如字节数组和端口。 wget 需要从端口 123 连接。你做到了吗?如果不使用其他客户端。 -
@usr: 我写了
wget http://mylocalip:8090/testTcpClient o是为了建立一个虚拟的传出连接。端口= 8090。我想如果传出连接的本地端口是我正在侦听的本地端口,那么当远程连接尝试使用相同的端口进行连接时,路由器会让它通过。也许它确实有效,但不适用于我的路由器。但是有一些软件可以成功地在我的路由器上打一个洞。 -
@usr:经过一番摆弄后,我注意到我的问题中的代码有效。我只需要仔细选择 linux 端口。如果我在我的 linux 机器上阻止传入连接(模拟路由器阻止连接),它似乎不起作用我使用了这个 iptable 规则gist.github.com/anonymous/514cdd23f749ca5d2385 所以现在我想知道我是否需要能够在我之前连接到远程方可以打孔。这确实违背了这一点,因为这个问题假设两方无法沟通,并且第三部分用于帮助打孔。也许我可以请朋友稍后运行代码
-
@usr:这个链接很长。我会尝试在赏金结束之前阅读它。另外我忘了提及如果我不阻止连接但忘记发送连接它不起作用(这是有道理的)。我的直觉表明,iptables 中的 REJECT 和 DROP 可能会发送某种信号,从而破坏打孔器
-
@usr 如果你想要一个可以监听端口的简单测试程序,socat 很方便,并且有一个 windows 端口……它就像 telnet 或 netcat,但有更多有趣的选项。 ..
标签: sockets tcp hole-punching