C#通过SendARP()获取WinCE设备的Mac网卡物理地址

C#通过SendARP()获取WinCE设备的Mac网卡物理地址,第1张

概述ARP(Address Resolution Protocol) 即 地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。 SendARP(IPAddr DestIP, IPAddr SrcIP, PULONG pMacAddr, PULONG  PhyAddrLen);   ①DestIP:访问的目标IP地址这个地址比较特殊,必须从十进制点分地址转换成32位有符号整数  在C#中为I

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

SendARP(IPAddr DestIP, IPAddr SrcIP, PulONG pMacAddr,PulONG  PhyAddrLen);

 

①DestIP:访问的目标IP地址这个地址比较特殊,必须从十进制点分地址转换成32位有符号整数  在C#中为Int32;

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

③pMacAddr:返回的目标MAC地址(十进制),我们将其转换成16进制后即是想要的结果;

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

 

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

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

//首先,要引入命名空间:using System.Runtime.InteropServices;
1 using System.Runtime.InteropServices;
//接下来导入C:\windows\System32下的"ws2_32.dll"动态链接库
2 [Dllimport("ws2_32.dll")] 3 private static extern int inet_addr(string ip);//声明方法
//调用方法
1
Int32 DestIP = inet_addr("192.168.×××.×××");


//但是个别WinCE设备是不支持"ws2_32.dll"动态库的,所以我们需要自己实现inet_addr()方法

输入是点分的IP地址格式(如A.B.C.D)的字符串,从该字符串中提取出每一部分,转换为int,假设得到4个int型的A,B,C,D,

DestIP (int ip)是转换后的结果, 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 = new Int64();                Int32 len = 6;                int res = SendARP(host,0,ref macInfo,ref len);                return Convert.ToString(macInfo,16);            }            catch (Exception err)            {                Console.Writeline("Error:{0}",err.Message);            }            return null;        }    }}

最终取得Mac地址

//本机Mac地址string Mac = GetLocalMac(GetLocaliP());

至此大功告成。

总结

以上是内存溢出为你收集整理的C#通过SendARP()获取WinCE设备的Mac网卡物理地址全部内容,希望文章能够帮你解决C#通过SendARP()获取WinCE设备的Mac网卡物理地址所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1086332.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存