日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

获取远程网卡MAC地址

發布時間:2023/11/27 生活经验 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取远程网卡MAC地址 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
出自: http://blog.joycode.com/liuhuimiao/

朋友mingal急問我有關獲取遠程網卡MAC地址的ASP.net實現。我一開始以為是獲取本機MAC地址,說了幾種方法給他。由于他還需要獲取服務器(本機)相關信息,如硬盤序列號、CPU信息等。于是介紹了個WMI方法給他:

using System.Management;

string strMac = string.Empty;
ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
ManagementObjectCollection moc = mc.GetInstances();
???
foreach(ManagementObject mo in moc)
{
???? if ((bool)mo["IPEnabled"] == true)
?? ? {
???? ?strMac += mo["MacAddress"].ToString() + "
";
???? }
}

??? 后來才知道他要的是局域網瀏覽用戶的網卡的MAC地址,那可犯難了。后來找到了相關實現代碼,大致是使用地址轉換協議進行廣播查詢的,主要是SendArp這個API:

DWORD SendARP(
? IPAddr DestIP,???? // 目的IP 地址
? IPAddr SrcIP,????? // 源IP地址,可選參數,把它填成0不會有問題
? PULONG pMacAddr,?? // 返回的物理地址
? PULONG PhyAddrLen? // 物理地址的長度
);

在C#中實現為:

[DllImport("Iphlpapi.dll")]
private static 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);

private IntPtr getRemoteMAC(string localIP, string remoteIP)
{
?? ??Int32 ldest= inet_addr(remoteIP);? //目的地的ip
??? ?Int32 lhost= inet_addr(localIP);???? ?//本地服務器的ip

???try
???{
???? ?Byte[] macinfo=new Byte[6];
??? ??IntPtr mac=new IntPtr(macinfo[0]);
???? ?IntPtr len=new IntPtr;
??????int ii=SendARP(ldest,lhost, ref mac, ref len);
???? ?return mac;
???}
???catch(Exception err)
???{
???}
???? ?return IntPtr.Zero;
}

??? 可是當把得到的IntPtr類型的MAC地址轉換為十六進制時,出現了令人不解的一幕。比如我的網卡MAC地址為00-50-BA-29-22-1A,可是轉換后的十六進制卻是29BA5000。顯然是要每兩位反過來排序,但是為什么卻缺少了 22-1A ?按道理說得到的結果應該是1A2229BA5000。另外,Arp只能獲得同一個網段的,不能跨網段!郁悶ing……,有什么更好的方法???

不應該用IntPtr的。通過它只能訪問到Int32(在32位平臺上)大小的內容。
下面修改過的C#代碼已驗證通過(未將網絡字節順序轉換為主機字節順序):

[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);

static private Int64 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 macinfo;
}
catch(Exception err)
{
Console.WriteLine("Error:{0}",err.Message);
}
return 0;
}

至于第二個問題,在標準網絡協議下,ARP包是不可能跨網段傳輸的,故想通
過ARP協議是無法查詢跨網段設備MAC地址的。


如何獲得System.Management?
引用下 System.Management 這個.net組件就行了.
提示: 類型或命名空間名稱“Management”在類或命名空間“System”中不存在(是否缺少程序集引用?)——怎么回事?
“添加引用”-->“.NET組件”-->找到System.Management.dll組件。按引用即可拉。

總結

以上是生活随笔為你收集整理的获取远程网卡MAC地址的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。