zoukankan      html  css  js  c++  java
  • c# 通过发送arp包获取ip等信息

    利用dns类和WMI规范获取IPMAC地址

    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,利用返回并存储在高速缓存中的IPMAC地址对,从而获取远程主机的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"));
       }
    }

  • 相关阅读:
    单个对象的内存管理分析
    在eclipse中引入jquery.js文件报错的解决方案
    ajax复习
    jquery介绍
    ajax调试小技巧
    ajax实现聊天室功能
    ajax(2)
    ajax经典案例--省市联动
    ajax技术返回json如何处理
    ajax如何处理返回的数据格式是xml的情况
  • 原文地址:https://www.cnblogs.com/Mr_JinRui/p/1778610.html
Copyright © 2011-2022 走看看