NetBIOS编程获取本机MAC地址及一个小坑
生活随笔
收集整理的這篇文章主要介紹了
NetBIOS编程获取本机MAC地址及一个小坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
0x00:NetBIOS網絡編程
參考資料:NetBIOS及其協議的應用
0x01:獲取本機MAC地址
《Windows 網絡編程》(第二版)書中 p175 的源代碼如下(有清晰注釋):
// GetMacAddress.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <windows.h> #include <stdlib.h> #include <Nb30.h>#pragma comment(lib, "netapi32.lib")typedef struct _ASTAT_ {ADAPTER_STATUS adapt;NAME_BUFFER NameBuff [30]; }ASTAT, * PASTAT;ASTAT Adapter;int _tmain(int argc, _TCHAR* argv[]) {NCB ncb; // NCB結構體,用于設置執行的NetBIOS命令和參數UCHAR uRetCode; // 執行Netbios()函數的返回值memset( &ncb, 0, sizeof(ncb) ); // 初始化ncb結構體ncb.ncb_command = NCBRESET; // 設置執行NCBRESETncb.ncb_lana_num = 0; // 設置LANA編號// 調用Netbios()函數,執行NCBRESET命令uRetCode = Netbios( &ncb );// 輸出執行NCBRESET命令的結果printf( "The NCBRESET return code is: 0x%x \n", uRetCode );memset( &ncb, 0, sizeof(ncb) ); // 初始化ncbncb.ncb_command = NCBASTAT; // 執行NCBASTAT命令ncb.ncb_lana_num = 0; // 設置LANA編號// 設置執行NCBASTAT命令的參數,將獲取到的網絡適配器數據保存到Adapter結構體中memcpy( &ncb.ncb_callname, "* ", 16 );ncb.ncb_buffer = (UCHAR*) &Adapter;ncb.ncb_length = sizeof(Adapter);// 調用Netbios()函數,執行NCBASTAT命令uRetCode = Netbios( &ncb );printf( "The NCBASTAT return code is: 0x%x \n", uRetCode );if ( uRetCode == 0 ){// 輸出MAC地址printf( "The Ethernet Number is: %02x-%02x-%02x-%02x-%02x-%02x\n",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] );}system("pause");return 0; }執行過后的結果如下
顯然沒有成功獲取到MAC地址,再看打印的內容,本來 Netbios() 函數執行過后的返回值應該是0x00,但是結果返回的是0x23,于是在VS中右鍵Netbios函數 -> 轉到定義,上下翻了一下,發現,找到了NETBIOS返回值及含義,如下圖
具體所有NETBIOS返回值及含義如下:
0x02:脫坑
所以具體原因是出現了在ncb_lana_num域中無效的編號這種錯誤,即程序中ncb.ncb_lana_num = 0; // 設置LANA編號這句賦值是有問題的,我們需要自己獲取本機的網卡信息,如有多少個網卡,每個網卡的編號等,具體代碼如下(原來的代碼并沒有刪除,而是注釋掉了,方便對比)
// GetMacAddress.cpp : 定義控制臺應用程序的入口點。 //#include "stdafx.h" #include <windows.h> #include <stdlib.h> #include <Nb30.h> #include <time.h>#pragma comment(lib, "netapi32.lib")typedef struct _ASTAT_ {ADAPTER_STATUS adapt;NAME_BUFFER NameBuff[30]; }ASTAT, *PASTAT;ASTAT Adapter;int _tmain(int argc, _TCHAR* argv[]) {NCB ncb; // NCB結構體,用于設置執行的NetBIOS命令和參數LANA_ENUM lana_enum; //包含當前LAN適配器的數量memset(&lana_enum, 0, sizeof(lana_enum));UCHAR uRetCode; // 執行Netbios()函數的返回值memset(&ncb, 0, sizeof(ncb)); // 初始化ncb結構體ncb.ncb_command = NCBENUM; //統計系統中網卡的數量 指定指令為NCBENUM,用于獲取網卡的數量及編號 向網卡發送NCBENUM命令,以獲取當前機器的網卡信息,如有多少個網卡,每個網卡的編號(MAC地址)ncb.ncb_buffer = (unsigned char *)&lana_enum;ncb.ncb_length = sizeof(LANA_ENUM);uRetCode = Netbios(&ncb);if (uRetCode != NRC_GOODRET)exit(-1);printf("MAC :\n");//二、NCBREST:重置LAN適配器for (int lana = 0; lana<lana_enum.length; lana++) {ncb.ncb_command = NCBRESET; //初始化邏輯網卡命令 ncb.ncb_lana_num = lana_enum.lana[lana]; uRetCode = Netbios(&ncb); memset(&ncb, 0, sizeof(ncb)); // 初始化ncbncb.ncb_command = NCBASTAT; // 執行NCBASTAT命令ncb.ncb_lana_num = lana_enum.lana[lana]; // 設置LANA編號// 設置執行NCBASTAT命令的參數,將獲取到的網絡適配器數據保存到Adapter結構體中strcpy((char*)ncb.ncb_callname, "*");//memcpy(&ncb.ncb_callname, "* ", 16);ncb.ncb_buffer = (UCHAR*)&Adapter;ncb.ncb_length = sizeof(Adapter);// 調用Netbios()函數,執行NCBASTAT命令uRetCode = Netbios(&ncb);//printf("The NCBASTAT return code is: 0x%x \n", uRetCode);if (uRetCode == 0){// 輸出MAC地址printf(" %02x-%02x-%02x-%02x-%02x-%02x\n",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]);}}system("pause");return 0; }最終結果如下:
當然,你也可以在代碼中加入自己想獲取的信息,如打印網卡數量,打印 Netbios() 返回值等。
最后貼兩篇我也不知道有沒有用的博客:
https://blog.csdn.net/pbl18392021230/article/details/72673417?utm_source=blogxgwz1
https://blog.csdn.net/qq_37711989/article/details/80877905
總結
以上是生活随笔為你收集整理的NetBIOS编程获取本机MAC地址及一个小坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim 修改注释颜色 tab键
- 下一篇: Cotherm 多物理场耦合方案