zoukankan      html  css  js  c++  java
  • 通过计算机名获取本网段内电脑的IP地址和MAC地址

    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(" 远程网卡信息:");
       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"));
    }
    }
  • 相关阅读:
    Struts2+Spring3+Mybatis3开发环境搭建
    spring+struts2+mybatis
    【LeetCode】Populating Next Right Pointers in Each Node
    【LeetCode】Remove Duplicates from Sorted Array
    【LeetCode】Remove Duplicates from Sorted Array II
    【LeetCode】Binary Tree Inorder Traversal
    【LeetCode】Merge Two Sorted Lists
    【LeetCode】Reverse Integer
    【LeetCode】Same Tree
    【LeetCode】Maximum Depth of Binary Tree
  • 原文地址:https://www.cnblogs.com/FLWL/p/3611465.html
Copyright © 2011-2022 走看看