簡體   English   中英

如何判斷是否將UDP數據包發送到開放端口?

[英]How can I tell if I sent a UDP packet to an open port?

我正在制作一個C程序,我需要檢查目標計算機上打開的UDP端口。 因為UDP是無連接的,所以我不能像TCP一樣檢查connect()的返回值。

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數據包發送到目標主機上的開放端口?

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

原則上,具有關閉端口的主機應該發送回ICMP端口不可達。 但他們經常不這樣做; 同樣,失敗或無法訪問的主機不會發送此類消息。 此外,一些防火牆將阻止該消息。

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

如果保證它是另一個端口上的特定協議,你可以發送一個應該引出特定響應的數據包(如果它是你自己的協議,你可以添加一個“你在那里”的消息類型),那么你可以使用那。 但一般來說,是否生成響應取決於應用程序,並且您無法區分沒有任何偵聽的端口,以及具有某些決定不響應您的偵聽的端口。

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

當然,你必須將它設計到發送端和接收端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM