2011-08-30 82 views
1

我希望用戶能夠輸入網絡上計算機的MAC。一旦他們完成了,它會將它添加到列表中。每次調用類時,程序都會在列表中ping所有這些MAC(我知道這不一定可行,但請繼續閱讀)。根據MAC地址ping網絡上的節點

一般情況下我簡單地使用IP地址,但它們不是靜態的,也有我不關心這個節目的連接在網絡上的設備的-lot-。如果他們沒有迴應,我希望它彈出一個消息框。

現在,他這樣說,我遇到的麻煩的唯一部分是實際的一部分,我平事。我知道當談到MAC地址時,實際的「ping」是不可能的,那麼我怎麼能檢查這樣的事情呢?或者,如果更簡單,我也可以接受根據計算機名稱ping的東西。

編輯:我不希望有使用的東西像ARP來找到我想要的設備的IP地址。就像我說的那樣,我也對是否有可能按名稱搜索設備感興趣。這會起作用嗎?

回答

1

如果你有一個適當的管理環境,你應該使用名字。通過適當的管理環境,我主要是說你的本地網絡上有一臺DNS服務器。

我有類似的運行ping工業以太網設備。這些是靜態分配的地址,因此它們不會像DNS客戶端那樣向DNS註冊自己。我讓我們的DNS管理員爲他們創建記錄,以便我可以使用他們的名字。從長遠來看,從現在開始兩年後,你將不知道該列表中的mac地址是指什麼。創建名稱時,可以根據需要將它們設置爲描述性的。

編輯:下面是需要一個名稱作爲字符串函數,從DNS查找相關的IP,然後可以Ping。如果DNS解析失敗或者ping不報告成功,則該函數返回false。否則返回true。稍後,您還應該記錄例外情況以進行故障排除。

public bool Check(string Name) 
{ 
    //try dns resolution, if fails, quit reporting error 
    IPAddress[] addresses = null; 
    try 
    { 
     addresses = Dns.GetHostAddresses(Name); 
    } 
    catch (SocketException) 
    { 
     return false; 
    } 

    //ping remote address 
    PingReply reply = ping.Send(addresses[0]); 
    switch (reply.Status) 
    { 
     case IPStatus.Success: 
      return true; 
      break; 
     default: 
      return false; 
      break; 
    } 
} 

編輯2:這裏是我在這個項目中使用的命名空間。不確定究竟在哪裏,但添加這三個將會使一切順利。

using System.Net.NetworkInformation; 
using System.Net; 
using System.Net.Sockets; 
+0

那麼我要ping的服務器確實有靜態名稱。你如何基於已保存的名稱列表進行ping操作? – Kulahan

+0

我添加了一個函數,它將ping從DNS解析返回的第一個可用地址。 HTH! –

+0

哇,太棒了!但出於好奇,你用什麼庫來實現這個目標? VS不識別IPAddress,DNS.GetHostAddress(Name)或(SocketException)。 – Kulahan

0

根據在網絡上,你可以使用ARP緩存中查找IP給定的MAC地址,即使你的網絡設置,例如,你可以做到這一點(,它只會如果MAC工作另一臺機器的地址在請求時在緩存中)。您可以read about arp on Wikipedia

+0

我曾希望避免使用MAC地址來查找IP地址。這似乎是不必要的開銷。這真的是唯一的解決方案嗎? – Kulahan

0

如果你有MAC地址可以使用MAC地址獲取IP地址和機器名。一旦擁有IP,您就可以簡單地ping機器。

this代碼爲如何從MAC IP地址的示例地址