明輝手游網(wǎng)中心:是一個免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

讀取網(wǎng)卡的MAC地址

[摘要]廣東深圳 溫衛(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) 用。


相關(guān)文章