當前位置:編程學習大全網 - 編程語言 - C# winform 獲取域名ip

C# winform 獲取域名ip

利用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"));

}

}

  • 上一篇:《機器人》幼兒園大班教案
  • 下一篇:如何自學編程語言
  • copyright 2024編程學習大全網