2012-03-08 56 views
7

我目前正在C#中使用一個小聊天工具。
問題是我無法弄清楚如何掃描所有機器上的特定端口的網絡。我目前使用這種方法如何掃描等待網絡連接的端口

IPGlobalProperties network = IPGlobalProperties.GetIPGlobalProperties(); 
    IEnumerable<IPEndPoint> connections = network.GetActiveTcpListeners() 
                 .Where(x => x.Port == ConstParams.iPort); 

其中ConstParams.iPort是我想要掃描(6910這裏)端口。

的問題是,返回的值是唯一的本地端口和「0.0.0.0」的IP地址......

我如何可以掃描當前網絡上的所有開放端口(6910)?

+1

展望如何* NMAP *作品可以幫助你描述。 – 2012-05-16 18:46:01

回答

9

而不是使用端口掃描,我建議你到基於組播/廣播通信實現一個簡單的發現機制。

在啓動過程中,應用程序應廣播/多播其IP /端口信息。所有正在運行的實例都應該使用其IP /端口信息來響應此消息。這種發現機制易於實現,運行速度更快,並且比端口掃描方法更具動態性。

+0

你能舉一些例子嗎? – rkmax 2012-05-17 22:40:20

1

掃描端口是一個糟糕的選擇,您很可能會觸發網絡中的計算機上的防火牆將您的計算機顯示爲攻擊者。網絡上的任何入侵檢測系統都可能被觸發。這對於你所需要的很多開銷。

我建議做使用UDP或組播發現其他客戶 http://www.codeproject.com/Articles/1705/IP-Multicasting-in-C

廣播另一種選擇是有一個集中的服務器,或者是Web服務器(PHP腳本,asp.net頁面,等上)或聊天客戶端在啓動時連接到的Web服務(REST),將其發送到監聽IP /端口,然後將接收所有最近宣佈的網絡上其他客戶端的IP /端口列表。您可能希望在這裏保持活躍狀態​​,IE:客戶端會每隔5分鐘向頁面發佈一次,如果IP在10分鐘內沒有POST,它將從列表中刪除。

拿到機器的公網IP,你可以看看這個頁面: http://www.whatismyip.com/faq/automation.asp

你只需要發送一個Web請求,來擷取的IP。如果你想獲得非0.0.0.0/127.0.0。本地接口1個IP,你可以檢查出這些職位:

Get local IP address

How do I get the Local Network IP address of a computer programmatically? (C#)