讀取網(wǎng)卡的MAC地址
發(fā)表時間:2024-06-06 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]廣東深圳 溫衛(wèi)江 ---- 在 實 際 的 應(yīng) 用 系 統(tǒng) 中, 我 們 往 往 會 需 要 在 程 序 運(yùn) 行 時 獲 取 當(dāng) 前 機(jī) 器 的 網(wǎng) 卡 的MAC 地 址, 以 便 作 為 某 種 標(biāo) 識 之 用, 如 控 制 程 序 的 合 法 性 等。 下 文 介 紹 如 何 用Micro...
廣東深圳 溫衛(wèi)江
---- 在 實 際 的 應(yīng) 用 系 統(tǒng) 中, 我 們 往 往 會 需 要 在 程 序 運(yùn) 行 時 獲 取 當(dāng) 前 機(jī) 器 的 網(wǎng) 卡 的MAC 地 址, 以 便 作 為 某 種 標(biāo) 識 之 用, 如 控 制 程 序 的 合 法 性 等。 下 文 介 紹 如 何 用Microsoft Visual C + + 6.0 開 發(fā) 這 樣 的 程 序。
----這 里 采 用 的 方 法 是 通 過Windows 9x/NT/Win2000 中 內(nèi) 置 的NetApi32.DLL 的 功 能 來 實 現(xiàn) 的。 首 先 通 過 發(fā) 送 NCBENUM 命 令, 獲 取 網(wǎng) 卡 的 數(shù) 目 和 每 張 網(wǎng) 卡 的 內(nèi) 部 編 號, 然 后 對 每 個 網(wǎng) 卡 標(biāo) 號 發(fā) 送NCBASTAT 命 令 獲 取 其MAC 地 址。 注 意: 這 里 的 網(wǎng) 卡 是 指 捆 綁 了NetBEIU 協(xié) 議 的 通 信 協(xié) 議 棧, 可 以 在 網(wǎng) 卡 的 屬 性 處 查 看 到。
----請 運(yùn) 行VC + +, 打 開 一 個 新 的 工 程, 選 擇 創(chuàng) 建 一 個Win32 Console 程 序, 然 后 按 下 文 輸 入 代 碼, 并 請 參 見 其 中 的 注 釋:
#include “stdafx.h"
#include
#include
#include
#include
#include
// 因 為 是 通 過NetAPI 來 獲 取 網(wǎng) 卡 信 息,
所 以 需 要 包 含 其 題 頭 文 件nb30.h
#include
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
// 定 義 一 個 存 放 返 回 網(wǎng) 卡 信 息 的 變 量
// 輸 入 參 數(shù):lana_num 為 網(wǎng) 卡 編 號,
一 般 地, 從0 開 始, 但 在Windows 2000 中
并 不 一 定 是 連 續(xù) 分 配 的
void getmac_one (int lana_num)
{
NCB ncb;
UCHAR uRetCode;
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_num;
// 指 定 網(wǎng) 卡 號
// 首 先 對 選 定 的 網(wǎng) 卡 發(fā) 送 一 個
NCBRESET 命 令, 以 便 進(jìn) 行 初 始 化
uRetCode = Netbios( &ncb );
printf( “The NCBRESET
return code is: 0x %x \n", uRetCode );
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_num; // 指 定 網(wǎng) 卡 號
strcpy((char *)ncb.ncb_callname,“ * " );
ncb.ncb_buffer = (unsigned char *) &Adapter;
// 指 定 返 回 的 信 息 存 放 的 變 量
ncb.ncb_length = sizeof(Adapter);
// 接 著, 可 以 發(fā) 送NCBASTAT 命 令
以 獲 取 網(wǎng) 卡 的 信 息
uRetCode = Netbios( &ncb );
printf( “The NCBASTAT return code is:
0x %x \n", uRetCode );
if ( uRetCode == 0 )
{
// 把 網(wǎng) 卡MAC 地 址 格 式 化 成
常 用 的16 進(jìn) 制 形 式, 如0010 -A4E4 -5802
printf( “The Ethernet Number[ %d] is:
%02X %02X - %02X %02X - %02X %02X\n",
lana_num,
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5] );
}
}
int main(int argc, char * argv[])
{
NCB ncb;
UCHAR uRetCode;
LANA_ENUM lana_enum;
memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(lana_enum);
// 向 網(wǎng) 卡 發(fā) 送NCBENUM 命 令,
以 獲 取 當(dāng) 前 機(jī) 器 的 網(wǎng) 卡 信 息,
如 有 多 少 個 網(wǎng) 卡、 每 張 網(wǎng) 卡 的 編 號 等
uRetCode = Netbios( &ncb );
printf( “The NCBENUM return code is:
0x %x \n", uRetCode );
if ( uRetCode == 0 )
{
printf( “Ethernet Count is : %d\n\n", lana_enum.length);
// 對 每 一 張 網(wǎng) 卡, 以 其 網(wǎng) 卡 編 號 為
輸 入 編 號, 獲 取 其MAC 地 址
for ( int i=0; i
----此 時, 按F7 編 譯, 按F5 運(yùn) 行 即 可。
----這 段 代 碼 可 以 直 接 嵌 入 相 關(guān) 的 應(yīng) 用 系 統(tǒng) 之 中, 或 封 裝 成.DLL 或COM 控 件, 以 便 可 以 在Visual Basic、Visual Foxpro、Power Builder 或Delphi 等 其 他 程 序 中 調(diào) 用。