请问大侠们:如何获取指定IP的MAC地址。
急呀,,,,

解决方案 »

  1.   

    哇塞 这么多点数?给你一个完整版的。using System;
    using System.Runtime.InteropServices;namespace UtilityControl
    {
    /// <summary>
    /// 关于IP地址的若干操作
    /// </summary>
    public class IP
    {
    public IP()
    {
    //
    // TODO: 在此处添加构造函数逻辑
    //
    } [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); /// <summary>
    /// 根据ip得到网卡mac地址
    /// </summary>
    /// <param name="ip">给出的ip地址</param>
    /// <returns>对应ip的网卡mac地址</returns>
    public static Int64 GetMACByIP(string ip) 

    Int32 ldest= inet_addr(ip); //目的地的ip 
    try 

    Int64 macinfo = new Int64(); 
    Int32 len = 6; 
    int res = SendARP(ldest,0, ref macinfo, ref len); 
    return macinfo; 

    catch(Exception err) 

    Console.WriteLine("Error:{0}",err.Message); 

    return 0; 

    }
    }
      

  2.   

    注意一下 MAC地址 是通过发送ARP包来完成。
      

  3.   

    楼主,我也在关注这个问题.realljx(购买或使用日货者可耻) 贴的方法,也就是我找到的方法.但是这样的返回,并不是"00-E0-4C-8C-43-C4"的形式。
    怎么转化,是个问题。
      

  4.   

    http://community.csdn.net/Expert/topic/3402/3402164.xml?temp=.9058802
      

  5.   

    [DllImport("iphlpapi.dll", ExactSpelling=true)]
    public static extern int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr,  [Out] int PhyAddrLen );调用:byte[] aa=byte[6];
    IPAddress addrD = IPAddress.Parse("192.168.1.20"); //需要取得MAC的网卡IP
    int len = aa.Length;
    int r = SendARP( (int) addrD.Address, 0 , aa, len );
    string mac = BitConverter.ToString( aa, 0, 6 );
    MessageBox.Show(mac);
      

  6.   

    to: ncowboy(35号房客)……要转成自己相要的格式自己写不用花什么时间吧
      

  7.   

    如果要想获得远程的地址,需要用sendarp这个函数来实现。具体的代码如下:
    [DllImport("Iphlpapi.dll")]
    private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length);
    [DllImport("Ws2_32.dll")]
    private static extern Int32 inet_addr(string ip);Int32 ldest= inet_addr("157.60.68.163");//目的地的ip
    Int32 lhost= inet_addr("157.60.68.33");//本地的iptry
    {
    Byte[] macinfo=new Byte[6];
    Int32 length=6;

    IntPtr mac=new IntPtr(macinfo[0]);
    IntPtr len=new IntPtr(6);
    int ii=SendARP(ldest,lhost, ref mac, ref len);

    Console.WriteLine("Mac Add:"+mac);
    Console.WriteLine("length:"+len);
    }
    catch(Exception err)
    {
    Console.WriteLine(err);
    }
      

  8.   


       文章标题:用C#取网卡MAC地址的类源码 
     
     未知   aspxcn.com   2002-09-19  
     
    在下公布这段代码,目的是与大家探讨有无更好的实现方法(如.NET存在直接调用?)。 
    在下愿与大家共同挖掘C#的精妙之处,一起揭示C#的神秘面纱。 如有不妥,可尽情表达。 
    1、 
    [code] 
       public enum NCBCONST 
       { 
          NCBNAMSZ   =16,      /* absolute length of a net name         */ 
          MAX_LANA   =254,      /* lana's in range 0 to MAX_LANA inclusive   */ 
          NCBENUM      =0x37,      /* NCB ENUMERATE LANA NUMBERS            */ 
          NRC_GOODRET   =0x00,      /* good return                              */ 
          NCBRESET    =0x32,      /* NCB RESET                        */ 
          NCBASTAT    =0x33,      /* NCB ADAPTER STATUS                  */ 
          NUM_NAMEBUF =30,      /* Number of NAME's BUFFER               */ 
       }    [StructLayout(LayoutKind.Sequential)] 
       public struct ADAPTER_STATUS 
       { 
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=6)] 
          public byte[] adapter_address; 
          public byte   rev_major;  
          public byte   reserved0;  
          public byte   adapter_type;  
          public byte   rev_minor;  
          public ushort    duration;  
          public ushort    frmr_recv;  
          public ushort    frmr_xmit;  
          public ushort    iframe_recv_err;  
          public ushort    xmit_aborts;  
          public uint   xmit_success;  
          public uint   recv_success;  
          public ushort    iframe_xmit_err;  
          public ushort    recv_buff_unavail;  
          public ushort    t1_timeouts;  
          public ushort    ti_timeouts;  
          public uint   reserved1;  
          public ushort    free_ncbs;  
          public ushort    max_cfg_ncbs;  
          public ushort    max_ncbs;  
          public ushort    xmit_buf_unavail;  
          public ushort    max_dgram_size;  
          public ushort    pending_sess;  
          public ushort    max_cfg_sess;  
          public ushort    max_sess;  
          public ushort    max_sess_pkt_size;  
          public ushort    name_count; 
       }    [StructLayout(LayoutKind.Sequential)] 
       public struct NAME_BUFFER 
       {  
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] 
          public byte[] name; 
          public byte name_num;  
          public byte name_flags;  
       }    [StructLayout(LayoutKind.Sequential)] 
       public struct NCB 
       {  
          public byte  ncb_command;  
          public byte  ncb_retcode;  
          public byte  ncb_lsn;  
          public byte  ncb_num;  
          public IntPtr ncb_buffer;  
          public ushort ncb_length;  
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] 
          public byte[]  ncb_callname;  
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NCBNAMSZ)] 
          public byte[]  ncb_name;  
          public byte  ncb_rto;  
          public byte  ncb_sto;  
          public IntPtr ncb_post;  
          public byte  ncb_lana_num;  
          public byte  ncb_cmd_cplt;  
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=10)] 
          public byte[] ncb_reserve; 
          public IntPtr ncb_event; 
       }    [StructLayout(LayoutKind.Sequential)] 
       public struct LANA_ENUM 
       {  
          public byte length;  
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.MAX_LANA)] 
          public byte[] lana; 
       }    [StructLayout(LayoutKind.Auto)] 
       public struct ASTAT 
       {  
          public ADAPTER_STATUS adapt; 
          [MarshalAs(UnmanagedType.ByValArray, SizeConst=(int)NCBCONST.NUM_NAMEBUF)] 
          public NAME_BUFFER[] NameBuff; 
       } 
       public class Win32API 
       { 
          [DllImport("NETAPI32.DLL")] 
          public static extern char Netbios(ref NCB ncb); 
       } 
    [/code] 2、 
    [code] 
          public string GetMacAddress() 
          { 
             string addr=""; 
             int cb; 
             ASTAT adapter; 
             NCB Ncb=new NCB(); 
             char uRetCode; 
             LANA_ENUM lenum;          Ncb.ncb_command = (byte)NCBCONST.NCBENUM; 
             cb = Marshal.SizeOf(typeof(LANA_ENUM)); 
             Ncb.ncb_buffer = Marshal.AllocHGlobal(cb); 
             Ncb.ncb_length = (ushort)cb; 
             uRetCode = Win32API.Netbios(ref Ncb); 
             lenum = (LANA_ENUM)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(LANA_ENUM)); 
             Marshal.FreeHGlobal(Ncb.ncb_buffer); 
             if(uRetCode != (short)NCBCONST.NRC_GOODRET) 
                return "";          for(int i=0; i < lenum.length ;i++) 
             { 
                Ncb.ncb_command = (byte)NCBCONST.NCBRESET; 
                Ncb.ncb_lana_num = lenum.lana[i]; 
                uRetCode = Win32API.Netbios(ref Ncb); 
                if(uRetCode != (short)NCBCONST.NRC_GOODRET) 
                   return "";             Ncb.ncb_command = (byte)NCBCONST.NCBASTAT; 
                Ncb.ncb_lana_num = lenum.lana[i]; 
                Ncb.ncb_callname[0]=(byte)'*'; 
                cb = Marshal.SizeOf(typeof(ADAPTER_STATUS)) + Marshal.SizeOf(typeof(NAME_BUFFER))*(int)NCBCONST.NUM_NAMEBUF; 
                Ncb.ncb_buffer = Marshal.AllocHGlobal(cb); 
                Ncb.ncb_length = (ushort)cb; 
                uRetCode = Win32API.Netbios(ref Ncb); 
                adapter.adapt = (ADAPTER_STATUS)Marshal.PtrToStructure(Ncb.ncb_buffer, typeof(ADAPTER_STATUS)); 
                Marshal.FreeHGlobal(Ncb.ncb_buffer);             if (uRetCode == (short)NCBCONST.NRC_GOODRET) 
                { 
                   if(i>0) 
                      addr += ":"; 
                   addr = string.Format("{0,2:X}{1,2:X}{2,2:X}{3,2:X}{4,2:X}{5,2:X}", 
                      adapter.adapt.adapter_address[0], 
                      adapter.adapt.adapter_address[1], 
                      adapter.adapt.adapter_address[2], 
                      adapter.adapt.adapter_address[3], 
                      adapter.adapt.adapter_address[4], 
                      adapter.adapt.adapter_address[5]); 
                } 
             } 
             return addr.Replace(' ', '0'); 
          } 
    [/code] 
     
     
     
      

  9.   

    用api函数读取硬盘的序列号
    在写程序时我们想对每一台计算机都生成一个唯一的标识,而且在一此共享软件中我们也看到,软件在不同的机器上生成了不同的标识,这是如何实现的呢,其实是软件有一部分程序读取了,本地计算机的一部分硬件参数(如硬盘序列号,网卡序列号等等),再通过一系列算法而得到了一个唯一标识,其实我们也可以通过一个api函数生成我们的唯一标识,由于硬盘人人都有,而网卡不一定每个人都有,所以以读硬盘序列号为例,
    下面就先介绍一下我们要用到的api函数
    BOOL GetVolumeInformation(
      LPCTSTR lpRootPathName,           // 硬盘的路径
      LPTSTR lpVolumeNameBuffer,        // 硬盘的卷标
      DWORD nVolumeNameSize,            // 卷标的字符串长度
      LPDWORD lpVolumeSerialNumber,     // 硬盘的序列号
      LPDWORD lpMaximumComponentLength, // 最大的文件长度
      LPDWORD lpFileSystemFlags,        // 文件系统的一此标志
      LPTSTR lpFileSystemNameBuffer,    // 存储所在盘符的分区类型的长指针变量
      DWORD nFileSystemNameSize         // 分区类型的长指针变量所指向的字符串长度
    );
    如果上述函数成功就返回一个非0值。光说不做,是不行了,我们还得实践一下:// 最大的文件长度
    首选用MFC AppWizard建立一个基于Dialog base的对话框工程,名为GetHardID,点击finish。
    加一个按钮,双击它,点击ok,并在对应的函数中加入如下代码:
    LPCTSTR lpRootPathName="c:\\"; //取C盘
    LPTSTR lpVolumeNameBuffer=new char[12];//磁盘卷标
    DWORD nVolumeNameSize=12;// 卷标的字符串长度
    DWORD VolumeSerialNumber;//硬盘序列号
    DWORD MaximumComponentLength;// 最大的文件长度
    LPTSTR lpFileSystemNameBuffer=new char[10];// 存储所在盘符的分区类型的长指针变量
    DWORD nFileSystemNameSize=10;// 分区类型的长指针变量所指向的字符串长度
    DWORD FileSystemFlags;// 文件系统的一此标志
    ::GetVolumeInformation(lpRootPathName,
      lpVolumeNameBuffer, nVolumeNameSize,
      &VolumeSerialNumber, &MaximumComponentLength,
      &FileSystemFlags,
      lpFileSystemNameBuffer, nFileSystemNameSize);CString str;
    str.Format("Seria Num is %lx ",VolumeSerialNumber);
    AfxMessageBox(str);编译,链接并运行程序,单击按钮,在弹出的对话框中就是我们要的序列号。
    对不对我们验证一下,进入dos窗口,打入"dir c:/p"命令,怎么样是不是和我们的程序显示的一模一样
    这样我们就在功告成了。 
      

  10.   

    to CSTerry(Terry) :
    我得到的是00-00-00-00-00-00using System;
    using System.Net;
    using System.Runtime.InteropServices;class Program
    {
    [DllImport("iphlpapi.dll", ExactSpelling=true)]
    public static extern int SendARP( int DestIP, int SrcIP, [Out] byte[] pMacAddr,  [Out] int PhyAddrLen ); static void Main()
    {
    byte[] aa=new byte[6];
    IPAddress addrD = IPAddress.Parse("192.168.103.39"); //需要取得MAC的网卡IP
    int len = aa.Length;
    int r = SendARP( (int) addrD.Address, 0 , aa, len );
    string mac = BitConverter.ToString( aa, 0, 6 );
    Console.WriteLine(mac);
    }
    }
      

  11.   

    SendArp得到的数转化成十六进制 就是你看到你的东东了。
      

  12.   

    这种方法在多网卡的机器上不能工作,只得到一个MAC