我已经有几天没有打洞了,为了有可靠的行为,但我现在已经到了死胡同了。在
UDP打孔非常有效:只需先将数据包发送到远程,然后让远程设备以另一种方式发送数据包,因为它将通过源NAT着陆。从我尝试的结果来看,这是相当可靠的。在
但是现在TCP。。。我不明白。在
现在,我可以通过nat建立连接,但是只能使用连接套接字:A.connect(B) -> Crash agains't B's NAT, but open a hole in A's NAT.
B.connect(A) -> Get in A's NAT hole, reach A's connecting socket.
但是现在,发送SYN数据包进行连接的两个套接字已经连接。在
你会以为我会这么做,通过2个NAT连接,万岁。在
但问题是,这不是一个正常的行为,本文给出了:http://www.brynosaurus.com/pub/net/p2pnat/,我应该能够有一个与连接套接字平行的侦听套接字。在
入站连接,我会接受一个侦听套接字。在
但是入站连接总是被连接套接字捕获,而不是被侦听套接字捕获…
例如:
^{pr2}$
现在有了这个脚本,只需与朋友或其他人商定一个端口,并在一端执行,Connecting.connect(...)应该运行一段时间(等待超时,因为SYN包撞到了遥远的NAT,但幸运的是在他自己的NAT中打开了一个洞),同时在另一端执行脚本,现在,Connecting.connect(...)将返回,因为它将已连接。在
最奇怪的是:Listening套接字从未被触发过。在
为什么?如何让侦听套接字通过连接套接字捕获入站连接?在
注意:关闭连接插座确实会在网络上发送一些立即关闭孔的信息,至少在我的网络上是这样。在
第二个注意:我在窗户上。在
编辑:主要问题是,在任何情况下,这个脚本输出CONNECTED [...],而不是{},这是不应该发生的。在