2012-06-04 267 views
4

如何使用本地C++檢查遠程UDP端口是否打開?由於UDP是無連接的,因此調用connect()沒有幫助。我不能嘗試綁定它,因爲它不是本地的。 nmap也不能表示。 (但netstat可以找出,但我認爲它看起來關於開放端口/文件的內部信息)。無論如何要檢測它?如果我在網絡級別下層,是否可以通過C++發送ICMP消息來檢查端口不可達狀態?我的意思是,這會提供足夠的港口狀態信息嗎?檢查C++中的開放UDP端口

平臺是Linux。

+0

什麼OS /平臺上的「本機C++」? – 0xC0000022L

+0

它在Linux平臺上 – Mustafa

+0

這裏的語言並不像您的代碼執行的特權級別那麼嚴重。例如,你可以像'nmap'一樣使用C++代碼中的'libpcap'庫。另外,我認爲如果你嘗試'nmap'的所有選項,你至少會得到一個關於該端口是否可能打開或被過濾的指示,即使在所有情況下都不能100%確定。使用'netstat'和'nmap'的地方有哪些選項? – 0xC0000022L

回答

4

我假設你正在試圖確定是否在遠程機器上的UDP端口正在通過防火牆傳遞和/或具有在其上運行的應用程序。

您無法可靠地確定這一點。最近可以嘗試發送一系列小數據報到該地址和端口,間隔大約1秒,大約10秒鐘。

如果沒有防火牆阻塞端口,並沒有應用程序正在運行,則遠程系統會發送回ICMP_UNREACH_PORT(端口不可達)。如果沒有阻止防火牆並且遠程系統關閉,則路由器可能會發回ICMP_UNREACH_HOSTICMP_UNREACH_NET。如果防火牆阻止了您,它可能會發回ICMP_UNREACH_FILTER_PROHIB,但大多數防火牆不會發回任何內容。

得到任何的背部的機率相當渺茫,因爲大多數防火牆阻止某種ICMP反饋。即使ICMP消息回來,linux通常不會讓你看到它,除非你以root身份運行。某些操作系統會將ICMP錯誤報告爲相同地址/端口的下一個sendto()的故障,這就是爲什麼您需要多次重複該消息的原因。但有些則不需要,在這種情況下,您必須打開特定的ICMP端口並解析任何返回消息。

即使您以某種方式獲取ICMP消息,也要明白它們不可靠。例如,即使應用程序不僅在監聽,也會主動向您發送數據,您可能會得到ICMP_UNREACH_PORT。 (這很少見,但我已經看到它發生了。)

如果應用程序在給定端口上運行,並且您知道該應用程序是什麼,並且您知道如何製作消息會導致應用程序響應給你,然後這樣做並得到迴應是最好的指示,端口是開放的。但是,沒有任何迴應意味着什麼:也許端口被阻止,也許應用程序沒有運行,或者它可能只是不喜歡你的消息。底線:不,不是真的。

0

還有就是要檢查一個遠程端口已準備好接收您的UDP數據報沒有防彈方式。由於UDP是無連接的,因此您可以告訴遠程主機是否正在迴應對您有意義的事情。可能有許多方法可以獲得提示(如端口掃描程序所做的那樣),但這不是我在生產代碼中依賴的東西。