C#程式設計之 如何獲取本地和遠端主機的IP及MAC地址
利用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 {
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 {
Console.WriteLine(temp[i]);
}
Console.WriteLine(gi.getRemoteMac("192.168.0.3","192.168.0.1"));
}
}