程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 如何用VC++開發讀取網卡MAC地址的程序

如何用VC++開發讀取網卡MAC地址的程序

編輯:關於VC++

在實際的應用系統中,我們往往會需要在程序運行時獲取當前機器的網卡的MAC地址,以便作為某種標識之用,如控制程序的合法性等。下文就如何用Microsoft Visual C++ 6.0開發這樣的程序演示如何實現其要點。

這裡采用的方法是通過Windows 9x/NT/Win2000中內置的NetApi32.DLL的功能來實現的,首先通過發送NCBENUM命令獲取網卡的數目和每個網卡的內部編號,然後對每個網卡標號發送NCBASTAT命令獲取其MAC地址。注意:這裡的網卡是指捆綁了NetBeui協議的通信協議棧,可以在網卡的屬性處查看到。

請運行VC++,打開一個新的工程,選擇創建一個Win32 Console程序,然後按下文輸入代碼,並請參見其中的注釋:

#include "stdafx.h"
#include < windows.h >
#include < wincon.h >
#include < stdlib.h >
#include < stdio.h >
#include < time.h >
---- // 因為是通過NetAPI來獲取網卡信息,所以需要包含其題頭文件nb30.h #include < nb30.h >
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
}ASTAT, * PASTAT;
ASTAT Adapter;
---- // 定義一個存放返回網卡信息的變量
---- // 輸入參數:lana_num為網卡編號,一般地,從0開始,但在Windows 2000中並不一定是連續分配的
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;
// 指定網卡號
---- // 首先對選定的網卡發送一個NCBRESET命令,以便進行初始化
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; // 指定網卡號
strcpy( (char *)ncb.ncb_callname,
"* " );
ncb.ncb_buffer = (unsigned char *) &Adapter;
---- // 指定返回的信息存放的變量
ncb.ncb_length = sizeof(Adapter);
---- // 接著,可以發送NCBASTAT命令以獲取網卡的信息
uRetCode = Netbios( &ncb );
printf( "The NCBASTAT
return code is: 0x%x\n", uRetCode );
if ( uRetCode == 0 )
{
---- // 把網卡MAC地址格式化成常用的16進制形式,如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);
---- // 向網卡發送NCBENUM命令,以獲取當前機器的網卡信息,如有多少個網卡、每張網卡的編號等
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);
---- // 對每一張網卡,以其網卡編號為輸入編號,獲取其MAC地址
for ( int i=0; i< lana_enum.length; ++i)
getmac_one( lana_enum.lana[i]);
}
return 0;
}

此時,按F7編譯、直至通過,按F5運行即可。

這段代碼可以直接嵌入相關的應用系統之中,或封裝成.DLL或COM控件,以便可以在Visual Basic、Visual Foxpro、Power Builder或Delphi等其他程序中調用

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved