2012-07-08 219 views
7

我正在嘗試使用netcat來模擬NAT穿越協議。使用netcat發送一個UDP數據包而無需綁定

我有一個實例正在監聽UDP包在端口6666,像這樣:

NC -ul 6666

在另一個終端窗口,我想定期從端口6666發送一個UDP包(打開我的路由器上的返回路徑。這將是在重複每20秒重新打開端口的腳本)

NC -u -p6666 mypinghost.com 4444

的問題是失敗的netcat在此消息的ping通話上:

NC:綁定失敗:地址已在使用

這意味着聽衆已經綁定到端口6666是從該端口發送,或者可能是netcat的是試圖綁定到6666聽阻塞另一個進程。

這是netcat的寫法嗎,或者我可以通過某種方式讓它發癢,讓我發送一個沒有綁定到端口的數據包來偵聽?

回答

2

我不相信你可以這樣使用netcat。我會建議編寫一個簡單的Python腳本,在一個進程中執行發送和接收任務。這樣,您可以獨佔該端口並仍然完成這兩項任務。

9

NC -ul 6666

收聽在UDP端口6666

NC -u -p6666 mypinghost.com 4444

使用UDP端口6666作爲源端口,發送到mypinghost:4444。

NC:綁定失敗:地址已在使用

這將是對第二netcat調用,其中6666是已經通過第一個使用。

這意味着收聽者具有綁定到端口6666是從那個端口

正確發送阻塞另一個過程。

或者可能該netcat正試圖綁定到6666進行監聽。

絕對說。你告訴它這樣做,所以它做到了。

在同一主機的兩個進程之間,你所要做的事情是不可能的。一次只能有一個進程使用特定的本地UDP端口,除非使用SO_REUSEADDRESS,而netcat似乎沒有實現。

正如另一張海報所說,解決方案在於使用單個進程。

+0

我有這個相同的問題,我想SO_REUSEADDRESS避免了這個錯誤。但是,然後返回消息不會被偵聽進程拾取 - 除非在發送進程綁定端口後啓動它。我的理解是,該選項用於「多播」(我不認爲是我的情況),但有辦法使用它,所以發送到端口6666的消息去到想要接收它們的進程,而不是最新的過程來綁定端口? – Edmund 2012-09-02 08:24:43

+0

@Edmund消息應該發送到從該端口接收的所有進程。 – EJP 2012-09-02 10:36:40

+0

「正在接收的進程」,你的意思是那些綁定它的,或者那些調用'recvfrom'的?恰巧,UDP數據報似乎只能被最近的綁定過程可靠地獲取。即使該進程從不調用'recvfrom',它仍然阻止另一方接收任何東西。但是這個評論討論越來越擁擠,所以我會問一個單獨的問題並且包含我的代碼,除非你能想到一些簡單的東西,可能我錯過了。 ;-) – Edmund 2012-09-02 11:08:15