如何使用本地C++檢查遠程UDP端口是否打開?由於UDP是無連接的,因此調用connect()
沒有幫助。我不能嘗試綁定它,因爲它不是本地的。 nmap
也不能表示。 (但netstat
可以找出,但我認爲它看起來關於開放端口/文件的內部信息)。無論如何要檢測它?如果我在網絡級別下層,是否可以通過C++發送ICMP消息來檢查端口不可達狀態?我的意思是,這會提供足夠的港口狀態信息嗎?檢查C++中的開放UDP端口
平臺是Linux。
如何使用本地C++檢查遠程UDP端口是否打開?由於UDP是無連接的,因此調用connect()
沒有幫助。我不能嘗試綁定它,因爲它不是本地的。 nmap
也不能表示。 (但netstat
可以找出,但我認爲它看起來關於開放端口/文件的內部信息)。無論如何要檢測它?如果我在網絡級別下層,是否可以通過C++發送ICMP消息來檢查端口不可達狀態?我的意思是,這會提供足夠的港口狀態信息嗎?檢查C++中的開放UDP端口
平臺是Linux。
我假設你正在試圖確定是否在遠程機器上的UDP端口正在通過防火牆傳遞和/或具有在其上運行的應用程序。
您無法可靠地確定這一點。最近可以嘗試發送一系列小數據報到該地址和端口,間隔大約1秒,大約10秒鐘。
如果沒有防火牆阻塞端口,並沒有應用程序正在運行,則遠程系統會發送回ICMP_UNREACH_PORT
(端口不可達)。如果沒有阻止防火牆並且遠程系統關閉,則路由器可能會發回ICMP_UNREACH_HOST
或ICMP_UNREACH_NET
。如果防火牆阻止了您,它可能會發回ICMP_UNREACH_FILTER_PROHIB
,但大多數防火牆不會發回任何內容。
得到任何的背部的機率相當渺茫,因爲大多數防火牆阻止某種ICMP反饋。即使ICMP消息回來,linux通常不會讓你看到它,除非你以root身份運行。某些操作系統會將ICMP錯誤報告爲相同地址/端口的下一個sendto()
的故障,這就是爲什麼您需要多次重複該消息的原因。但有些則不需要,在這種情況下,您必須打開特定的ICMP端口並解析任何返回消息。
即使您以某種方式獲取ICMP消息,也要明白它們不可靠。例如,即使應用程序不僅在監聽,也會主動向您發送數據,您可能會得到ICMP_UNREACH_PORT
。 (這很少見,但我已經看到它發生了。)
如果應用程序在給定端口上運行,並且您知道該應用程序是什麼,並且您知道如何製作消息會導致應用程序響應給你,然後這樣做並得到迴應是最好的指示,端口是開放的。但是,沒有任何迴應意味着什麼:也許端口被阻止,也許應用程序沒有運行,或者它可能只是不喜歡你的消息。底線:不,不是真的。
還有就是要檢查一個遠程端口已準備好接收您的UDP數據報沒有防彈方式。由於UDP是無連接的,因此您可以告訴遠程主機是否正在迴應對您有意義的事情。可能有許多方法可以獲得提示(如端口掃描程序所做的那樣),但這不是我在生產代碼中依賴的東西。
什麼OS /平臺上的「本機C++」? – 0xC0000022L
它在Linux平臺上 – Mustafa
這裏的語言並不像您的代碼執行的特權級別那麼嚴重。例如,你可以像'nmap'一樣使用C++代碼中的'libpcap'庫。另外,我認爲如果你嘗試'nmap'的所有選項,你至少會得到一個關於該端口是否可能打開或被過濾的指示,即使在所有情況下都不能100%確定。使用'netstat'和'nmap'的地方有哪些選項? – 0xC0000022L