C#擷取IP及MAC地址

來源:互聯網
上載者:User
 
利用dns類和WMI規範擷取IP及MAC地址

在C#編程中,要擷取主機名稱和主機IP地址,是比較容易的.它提供的Dns類,可以輕鬆的取得主機名稱和IP地址.

樣本:
string strHostName = Dns.GetHostName(); //得到原生主機名稱
IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本機IP
string strAddr = ipEntry.AddressList[0].ToString(); //假設本地主機為單網卡

在這段代碼中使用了兩個類,一個是Dns類,另一個為IPHostEntry類,二者都存在於命名空間System.Net中.
Dns類主要是從網域名稱系統(DNS)中檢索關於特定主機的資訊,上面的代碼第一行就從本地的DNS中檢索出本地主機名稱.
IPHostEntry類則將一個網域名稱系統或主機名稱與一組IP地址相關聯,它與DNS類一起使用,用於擷取主機的IP地址組.
要擷取遠程主機的IP地址,其方法也是大同小異.

在擷取了IP地址後,如果還需要取得網卡的MAC地址,就需要進一步探究了.
這裡又分兩種情況,一是本機MAC地址,二是遠程主機MAC地址.二者的擷取是完全不同的.
在擷取原生MAC地址時,可以使用WMI規範,通過SELECT語句提取MAC地址.在.NET架構中,WMI規範的實現定義在System.Management命名空間中.
ManagementObjectSearcher類用於根據指定的查詢檢索管理對象的集合
ManagementObjectCollection類為管理對象的集合,下例中由檢索對象返回管理對象集合賦值給它.

樣本:
ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ;
ManagementObjectCollection queryCollection = query.Get();
foreach( ManagementObject mo in queryCollection )
{
if(mo["IPEnabled"].ToString() == "True")
mac = mo["MacAddress"].ToString();
}

擷取遠程主機的MAC地址時,需要借用API函數SendARP.該函數使用ARP協議,向目的主機發送ARP包,利用返回並儲存在快取中的IP和MAC地址對,從而擷取遠程主機的MAC地址.

樣本:
Int32 ldest= inet_addr(remoteIP); //目的ip
Int32 lhost= inet_addr(localIP); //本地ip

try
{
Int64 macinfo = new Int64();
Int32 len = 6;
int res = SendARP(ldest,0, ref macinfo, ref len); //發送ARP包
return Convert.ToString(macinfo,16);
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0.ToString();

但使用該方式擷取MAC時有一個很大的限制,就是只能擷取同網段的遠程主機MAC地址.因為在標準網路通訊協定下,ARP包是不能跨網段傳輸的,故想通過ARP協議是無法查詢跨網段裝置MAC地址的。

樣本程式:

using System.Net;
using System;
using System.Management;
using System.Runtime.InteropServices;

public class getIP
{
[DllImport("Iphlpapi.dll")]
private static extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
[DllImport("Ws2_32.dll")]
private static extern Int32 inet_addr(string ip);

//擷取原生IP
public string getLocalIP()
{
   string strHostName = Dns.GetHostName(); //得到原生主機名稱
   IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本機IP
   string strAddr = ipEntry.AddressList[0].ToString();
   return(strAddr);
}
//擷取原生MAC
public string getLocalMac()
{
   string mac = null;
   ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ;
   ManagementObjectCollection queryCollection = query.Get();
   foreach( ManagementObject mo in queryCollection )
   {
      if(mo["IPEnabled"].ToString() == "True")
        mac = mo["MacAddress"].ToString();
   }
   return(mac);
}

//擷取遠程主機IP
public string[] getRemoteIP(string RemoteHostName)
{
   IPHostEntry ipEntry = Dns.GetHostByName(RemoteHostName);
   IPAddress[] IpAddr = ipEntry.AddressList;
   string[] strAddr = new string[IpAddr.Length];
   for (int i=0;i<IPADDR.LENGTH;I++)
   {
    strAddr[i] = IpAddr[i].ToString();
   }
   return(strAddr);
}
//擷取遠程主機MAC
public string getRemoteMac(string localIP, string remoteIP)
{
   Int32 ldest= inet_addr(remoteIP); //目的ip
   Int32 lhost= inet_addr(localIP); //本地ip

   try
   {
    Int64 macinfo = new Int64();
    Int32 len = 6;
    int res = SendARP(ldest,0, ref macinfo, ref len);
    return Convert.ToString(macinfo,16);
   }
   catch(Exception err)
   {
    Console.WriteLine("Error:{0}",err.Message);
   }
   return 0.ToString();
}

public static void Main(string[] args)
{
   getIP gi = new getIP();
   Console.WriteLine("本地網卡資訊:");
   Console.WriteLine(gi.getLocalIP() + " - " + gi.getLocalMac());
  
   Console.WriteLine("\n\r遠程網卡資訊:");
   string[] temp = gi.getRemoteIP("scmobile-tj2");
   for(int i=0;i<TEMP.LENGTH;I++)
   {
         Console.WriteLine(temp[i]);
   }
   Console.WriteLine(gi.getRemoteMac("192.168.0.3","192.168.0.1"));
}
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.