獲取遠端網絡卡MAC位址

2022-01-26 13:47:06 字數 1702 閱讀 2680

出自:

朋友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)

}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)

???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)

catch(exception err)

",err.message);

} return 0;

} 至於第二個問題,在標準網路協議下,arp包是不可能跨網段傳輸的,故想通

過arp協議是無法查詢跨網段裝置mac位址的。

獲取網絡卡MAC位址

做網路程式設計的程式設計師免不了要與mac位址打交道,這個128bit的數字串在某種程度上就代表了機器的唯一性,因此在做統計工作時一般都以mac位址作為標準。下面介紹兩種獲取本機mac位址的方式。1.通過請求netbios服務獲取mac位址 2.通過iphelpapi獲取。第一種方法要求本機開啟了n...

c 獲取網絡卡MAC位址

一台機器上可能有多個網絡卡,每乙個網絡卡只有乙個mac位址,但是每乙個網絡卡可能配置有多個ip位址 如平常的膝上型電腦中,就會有無線網絡卡和有線網絡卡 網線介面 兩種 因此,如果要獲得本機所有網絡卡的ip和mac位址資訊,則必須順序獲得每個網絡卡,再依次獲取其資訊等 在windows sdk中,用i...

獲取指定網絡卡的MAC位址

由於終端裝置多網絡卡使用的問題,以前使用netbios 獲取網絡卡mac位址的方法可能導致不可靠的問題。現推薦大家使用如下方法實現 cstring getlicense cstring strmac cstring getmacbyname cstring strname strcat szfile...