string
strHostName = Dns.GetHostName();
IPHostEntry ipEntry = Dns.GetHostByName(strHostName);
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);
Int32 lhost= inet_addr(localIP);
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();
但使用该方式获取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);
public
string
getLocalIP()
{
string
strHostName = Dns.GetHostName();
IPHostEntry ipEntry = Dns.GetHostByName(strHostName);
string
strAddr = ipEntry.AddressList[0].ToString();
return
(strAddr);
}
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);
}
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);
}
public
string
getRemoteMac(
string
localIP,
string
remoteIP)
{
Int32 ldest= inet_addr(remoteIP);
Int32 lhost= inet_addr(localIP);
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(
"
远程网卡信息:"
);
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"
));
}
}