zoukankan      html  css  js  c++  java
  • C#通过SendARP()获取WinCE设备的Mac网卡物理地址

    ARP(Address Resolution Protocol) 即 地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议

    SendARP(Int32 dest, Int32 host, out Int64 mac, out Int32 length)

    ①dest:访问的目标IP地址,既然获取本机网卡地址,写本机IP即可 这个地址比较特殊,必须从十进制点分地址转换成32位有符号整数  在C#中为Int32;

    ②host:源IP地址,即时发送者的IP地址,这里可以随便填写,填写Int32整数即可;

    ③mac:返回的目标MAC地址(十进制),我们将其转换成16进制后即是想要的结果用out参数加以接收;

    ④length:返回的是pMacAddr目标MAC地址(十进制)的长度,用out参数加以接收。

    如果使用的是C++或者C语言可以直接调用 inet_addr("192.168.0.×××")得到 参数dest 是关键

    现在用C#来获取,首先需要导入"ws2_32.dll"这个库,这个库中存在inet_addr(string cp)这个方法,之后我们就可以调用它了。

    
    
    //首先,要引入命名空间:using System.Runtime.InteropServices;
    1 using System.Runtime.InteropServices;
    //接下来导入C:WindowsSystem32下的"ws2_32.dll"动态链接库,先去文件夹中搜索一下,文件夹中没有Iphlpapi.dll的在下面下载
    2 [DllImport("ws2_32.dll")]
    3 private static extern int inet_addr(string ip);//声明方法
    
    Iphlpapi.dll的点击 这里 下载
    
    
    //第二 调用方法
    Int32 desc = inet_addr("192.168.0.××");
    
    /*由于个别WinCE设备是不支持"ws2_32.dll"动态库的,所以我们需要自己实现inet_addr()方法
    
    输入是点分的IP地址格式(如A.B.C.D)的字符串,从该字符串中提取出每一部分,为int,假设得到4个int型的A,B,C,D,
    
    ,IP = D<<24 + C<<16 + B<<8 + A(网络字节序),即inet_addr(string ip)的返回结果,
    我们也可以把该IP转换为主机字节序的结果,转换方法一样 A<<24 + B<<16 + C<<8 + D
    */
    

      

     

    接下来是完整代码

    
    
    using System;
    using System.Runtime.InteropServices;
    using System.Net;
    using System.Diagnostics;
    using System.Net.Sockets;
    
    public class MacAddressDevice
        {
            [DllImport("Iphlpapi.dll")]
            private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length);
    
            //获取本机的IP
            public static byte[] GetLocalIP()
            {
                //得到本机的主机名
                string strHostName = Dns.GetHostName(); 
                try
                {
                    //取得本机所有IP(IPV4 IPV6 ...)
                    IPAddress[] ipAddress = Dns.GetHostEntry(strHostName).AddressList; 
                    byte[] host = null;
                    foreach (var ip in ipAddress)
                    {
                        while (ip.GetAddressBytes().Length == 4)
                        {
                            host = ip.GetAddressBytes();
                            break;
                        }
                        if (host != null)
                            break;
                    }
                    return host;
                }
                catch (Exception)
                {
                    return null;
                }
    
            }
    
            // 获取本地主机MAC地址
            public static string GetLocalMac(byte[] ip)
            {
           if(ip == null)
           return null;    
    
                int host = (int)((ip[0]) + (ip[1] << 8) + (ip[2] << 16) + (ip[3] << 24));
                try
                {
                    Int64 macInfo = 0;
                    Int32 len = 0;
                    int res = SendARP(host, 0, out macInfo, out len);
                    return Convert.ToString(macInfo, 16);
                }
                catch (Exception err)
                {
                    Console.WriteLine("Error:{0}", err.Message);
                }
                return null;
            }
    
        }
    }
    
    

    最终取得Mac地址

    
    
    //本机Mac地址
    string Mac = GetLocalMac(GetLocalIP());
    
    //得到Mac地址是小写的,或者前后次序颠倒的,自己转换为正常的即可。
  • 相关阅读:
    伟景行 citymaker 从入门到精通(2)——工程图层树加载
    伟景行 citymaker 从入门到精通系列
    伟景行 citymaker 从入门到精通(1)——js开发,最基本demo,加载cep工程文件
    Android手机屏幕投射到电脑神器Vysor
    GeoTools坐标转换(投影转换和仿射变换)
    微信开发系列(1):企业号回调模式认证
    通过扩大IE使用内存,解决skyline在IE下模型不能加载的方法
    SDE ST_Geometry SQL st_intersects查询很慢的解决方法
    axTE3DWindowEx双屏对比控件白屏解决方法以及网上方法的校正(CreateControlOveride)
    namespace使用方法
  • 原文地址:https://www.cnblogs.com/JourneyOfFlower/p/SendARP.html
Copyright © 2011-2022 走看看