自从我打孔打孔几天后,为了有一种可靠的行为,但我现在处于死路一条。TCP打孔(旁路监听插座)
UDP打孔的伟大工程:只需先发送一个数据包到远端,并获得远程发送一个数据包的otherway,因为它会通过源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.
但现在,这sended连接的SYN数据包的两个插座连接。
你会认为我会做到这一点,通过2 NAT的连接,万岁。
但问题是,这不是一个正常的行为,并给予本文:http://www.brynosaurus.com/pub/net/p2pnat/,我应该可以有一个监听插座并联到连接插座。
所以我确实绑定了一个监听套接字,它可以接受入站连接。
但入站连接总是由一个倾听的连接插座,而不是陷入...
如:
#!/usr/bin/env python3
from socket import *
from threading import Thread
Socket = socket
# The used endpoints:
LOCAL = '0.0.0.0', 7000
REMOTE = 'remote', 7000
# Create the listening socket, bind it and make it listen:
Listening = Socket(AF_INET, SOCK_STREAM)
Listening.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
Listening.bind(LOCAL)
Listening.listen(5)
# Just start in another thread some kind of debug:
# Print the addr of any connecting client:
def handle():
while not Listening._closed:
client, addr = Listening.accept()
print('ACCEPTED', addr)
Thread(target=handle).start()
# Now creating the connecting socket:
Connecting = Socket(AF_INET, SOCK_STREAM)
Connecting.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
Connecting.bind(LOCAL)
# Now we can attempt a connection:
try:
Connecting.connect(REMOTE)
print('CONNECTED', Connecting.getpeername())
except Exception as e:
print('TRIED', type(e), e)
现在有了这个脚本,只是同意在端口上一个朋友或其他任何人,并执行它的一端,Connecting.connect(...)
应运行一点点(等待超时,因为SYN数据包坠毁到远处的NAT,但幸运的是在他自己的NAT中打开了一个洞),同时执行脚本另一端,现在Connecting.connect(...)
会返回因为它会连接。
最奇怪的部分是:Listening
插座从未触发。
为什么?如何让侦听套接字通过连接套接字捕获入站连接?
注意:关闭连接插座确实会在网络上发送一些立即关闭该孔的东西,至少它会在我的网络上发生。
2nd-Note:我在窗户上。
编辑:主要的问题是,在任何情况下,该脚本输出CONNECTED [...]
而不是CLIENT [...]
,其中给出了一些讲座不应该发生。
您是否试图在侦听端获取数据包捕获?你看到远程端的SYN请求吗? –
是的,正如我所说,每个双方插座(远程/本地)做建立连接,但不是在'Listening'插座... – WKnight02