出自:
朋友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...