2011-01-09 80 views
5

我正在製作一個C程序,我需要檢查目標計算機上打開的UDP端口。由於UDP是無連接的,我無法像使用TCP一樣檢查返回值connect()如何判斷我是否將UDP數據包發送到開放端口?

send()sendto()返回值也沒有幫助。手冊頁指出:

No indication of failure to deliver is implicit in a send(). Locally 
    detected errors are indicated by a return value of -1. 

如何判斷是否將UDP數據包發送到目標主機上的開放端口?

回答

6

一般來說,你不能這樣做。

原則上,一個封閉端口的主機應該發回一個ICMP端口 - 無法訪問。但他們通常不會;同樣,一個關閉或無法訪問的主機不會發送這樣的消息。另外,一些防火牆會阻止該消息。

檢索錯誤也是有問題的。 Linux具有定義明確的語義,但用於檢索套接字上的錯誤(有關信息,請參閱各種手冊頁,套接字(7),ip(7)和udp(7))。例如,當您執行不相關的sendto()時,您有時會看到先前報告的錯誤。其他操作系統對於檢索特定套接字錯誤的機制稍有不同。

如果確保它是另一個端口上的特定協議,則可以發送一個應引發特定響應的數據包(如果它是您自己的協議,則可以添加「你在那裏」消息類型),那麼你可以使用它。但總的來說,是否產生響應取決於應用程序,並且您無法區分不監聽的端口和監聽的端口,從而決定不響應您的響應。

+1

不好意思問這個問題,但是如何知道它是否給我發送了ICMP端口 - 無法訪問?謝謝。 – Marian 2011-01-09 15:40:09

2

由於UDP是無連接的,因此您必須檢查應用程序代碼中的端口狀態。例如,發送一個數據包到端口,並等待響應。如果您在某些特定應用程序時間內未收到響應,則該端口不可用。

當然,您必須將其設計爲發送端和接收端。

+1

哦...所以沒有正確的方法來檢查然後。謝謝 – Marian 2011-01-09 15:31:07

相關問題