自從我打孔打孔幾天後,爲了有一種可靠的行爲,但我現在處於死路一條。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