2012-04-05 108 views
1

我有UDPserver接收來自客戶端的消息並向他們發送響應。但是我需要檢查一下UDP客戶端是否在線。 使用isReachable我可以測試pc是否在線。但是當不同的客戶端使用相同的PC但具有不同的端口時如何檢查端口是否打開(客戶端1的端口5678在線但客戶端2 6777關閉.IP 192.168.1.7在這種情況下IP是可達的,但客戶端2不是)?如何檢查端口是否在客戶端電腦上打開?

+1

我相信這超出了UDP的範圍。 – Nick 2012-04-05 13:54:59

+0

嗯...我可以用線程做這樣的事情嗎?線程服務器的消息和線程供用戶選擇? – 2012-04-05 14:22:15

+0

我認爲你需要用你想用用戶選擇實現的目標來更新這個問題。或者在這個問題上選擇一個答案,並創建一個後續問題。 – Paaske 2012-04-05 14:34:26

回答

1

UDP是一種無連接,不可靠的面向分組的協議。如果沒有綁定到遠程機器上特定端口的套接字,那麼數據包將被簡單地丟棄。

您將不得不實施某種支持檢測客戶端是否在線的協議。也許定期發送保持活動類型的消息。

+0

但客戶端可以發送消息到服務器。消息由用戶選擇。而且不可能等待用戶的選擇,同時也不能等待服務器的消息。或者它可能在UDP上? – 2012-04-05 14:10:11

1

你在這裏混淆了兩個不同的概念。 'isReachable'函數是一個IP層屬性,它只是簡單地檢查IP地址是否對IP協議數據包(它是)做出響應。

UDP是一種廣播數據報協議,專爲通過IP進行未確認的數據廣播而設計,因此它沒有內置的'可達性'概念。您的UDP客戶端必須以某種方式監視傳入的檢測消息,並相應地對其進行響應。

1

如果您的客戶端沒有運行,IsReachable將僅對給定的主機so event執行ICMP回顯請求(ping),但只要您的主機響應ICM請求,它將顯示爲可訪問。

如果您要檢查您的遠程客戶端是否正在運行,您需要實現一個簡單的「ping」協議:即:您的服務器將向客戶端發送特殊消息,並且客戶端必須對其進行響應。

1

如果唯一的問題是要知道客戶端是否還活着,那麼來自客戶端的保持活動消息是最簡單的。您可以從包的內容(或發件人端口)識別客戶端。

如果你想發送消息到客戶端,我認爲你必須在兩端都有一個UDP服務器,然後交換'客戶端 - 服務器'正在監聽的端口並將其用於通信。

當然,後者會導致防火牆出現問題,因爲大多數會阻止所有傳入流量。