日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NetBIOS编程获取本机MAC地址及一个小坑

發(fā)布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NetBIOS编程获取本机MAC地址及一个小坑 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

0x00:NetBIOS網(wǎng)絡(luò)編程

參考資料:NetBIOS及其協(xié)議的應(yīng)用

0x01:獲取本機MAC地址

《Windows 網(wǎng)絡(luò)編程》(第二版)書中 p175 的源代碼如下(有清晰注釋):

// GetMacAddress.cpp : 定義控制臺應(yīng)用程序的入口點。 //#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結(jié)構(gòu)體,用于設(shè)置執(zhí)行的NetBIOS命令和參數(shù)UCHAR uRetCode; // 執(zhí)行Netbios()函數(shù)的返回值memset( &ncb, 0, sizeof(ncb) ); // 初始化ncb結(jié)構(gòu)體ncb.ncb_command = NCBRESET; // 設(shè)置執(zhí)行NCBRESETncb.ncb_lana_num = 0; // 設(shè)置LANA編號// 調(diào)用Netbios()函數(shù),執(zhí)行NCBRESET命令uRetCode = Netbios( &ncb );// 輸出執(zhí)行NCBRESET命令的結(jié)果printf( "The NCBRESET return code is: 0x%x \n", uRetCode );memset( &ncb, 0, sizeof(ncb) ); // 初始化ncbncb.ncb_command = NCBASTAT; // 執(zhí)行NCBASTAT命令ncb.ncb_lana_num = 0; // 設(shè)置LANA編號// 設(shè)置執(zhí)行NCBASTAT命令的參數(shù),將獲取到的網(wǎng)絡(luò)適配器數(shù)據(jù)保存到Adapter結(jié)構(gòu)體中memcpy( &ncb.ncb_callname, "* ", 16 );ncb.ncb_buffer = (UCHAR*) &Adapter;ncb.ncb_length = sizeof(Adapter);// 調(diào)用Netbios()函數(shù),執(zhí)行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; }

執(zhí)行過后的結(jié)果如下

顯然沒有成功獲取到MAC地址,再看打印的內(nèi)容,本來 Netbios() 函數(shù)執(zhí)行過后的返回值應(yīng)該是0x00,但是結(jié)果返回的是0x23,于是在VS中右鍵Netbios函數(shù) -> 轉(zhuǎn)到定義,上下翻了一下,發(fā)現(xiàn),找到了NETBIOS返回值及含義,如下圖

具體所有NETBIOS返回值及含義如下

00h : 成功地完成,成功返回 01h : 無效的緩沖區(qū) 03h : 無效的命令 05h : 命令超時 06h : 不完整地接收消息 07h : 本地No-Ack命令失敗 08h : 無效的本地會話 09h : 沒有可使用的資源 0Ah : 會話已關(guān)閉 0Bh : 命令已撤消 0Dh : 本地NetBIOS命名表中名字重復(fù) 0Eh : NetBIOS命名表滿 0Fh : 名字具有活動會話,現(xiàn)被撤消登記 11h : NetBIOS 本地會話表滿了 12h : 沒有掛起的Listen 命令,所有拒絕斷開會話 13h : 非法名字編號 14h : 不能找到被調(diào)用名字或無回答 15h : 找不到命令,或不能把*號或00h指定ncb_name的首字節(jié),或名字已被撤消而不能再使用 17h : 名字已被刪除18h : 會話非正常結(jié)束 19h : 檢測到名字沖突 1Ah : 不兼容的遠(yuǎn)程設(shè)備 21h : 接口忙 22h : 掛起的命令太多 23h : 在ncb_lana_num域中無效的編號 24h : 產(chǎn)生取消時,命令已完成 25h : 字節(jié)組名命令指定了保留名字 26h : 命令不能被撤消 30h : 被另一個進(jìn)程定義了名字 34h : NetBIOS環(huán)境未被定義 35h : 所用的操作系統(tǒng)資源用盡 36h : 超出最大應(yīng)用個數(shù) 37h : NetBIOS無可以使用的SAP 38h : 無可以使用的請求資源 40h : 系統(tǒng)錯誤 41h : 檢測到遠(yuǎn)程適配器的熱載波 42h : 檢測到本地適配器的熱載波 43h : 未檢測到載波 4Eh : 狀態(tài)位12、14、或15被置位的時間超過 1 min 4Fh : 狀態(tài)位8--11中的一個或多個被置位 50h-F6h: 適配器發(fā)生故障 F7h : 隱式DIR-INITIALIZE錯誤 F8h : 隱式DIR-OPEN-ADAPTER 錯誤 F9h : IBM LAN支持程序內(nèi)部錯誤 Fah : 適配器檢查 FBh : NetBIOS 程序未被裝入PC FCh : DIR-OPEN-ADAPTER 或 DIR-OPEN-SAP失敗 FDh : 不期望關(guān)閉適配器 FFh : 命令掛起狀態(tài)

0x02:脫坑

所以具體原因是出現(xiàn)了在ncb_lana_num域中無效的編號這種錯誤,即程序中ncb.ncb_lana_num = 0; // 設(shè)置LANA編號這句賦值是有問題的,我們需要自己獲取本機的網(wǎng)卡信息,如有多少個網(wǎng)卡,每個網(wǎng)卡的編號等,具體代碼如下(原來的代碼并沒有刪除,而是注釋掉了,方便對比)

// GetMacAddress.cpp : 定義控制臺應(yīng)用程序的入口點。 //#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結(jié)構(gòu)體,用于設(shè)置執(zhí)行的NetBIOS命令和參數(shù)LANA_ENUM lana_enum; //包含當(dāng)前LAN適配器的數(shù)量memset(&lana_enum, 0, sizeof(lana_enum));UCHAR uRetCode; // 執(zhí)行Netbios()函數(shù)的返回值memset(&ncb, 0, sizeof(ncb)); // 初始化ncb結(jié)構(gòu)體ncb.ncb_command = NCBENUM; //統(tǒng)計系統(tǒng)中網(wǎng)卡的數(shù)量 指定指令為NCBENUM,用于獲取網(wǎng)卡的數(shù)量及編號 向網(wǎng)卡發(fā)送NCBENUM命令,以獲取當(dāng)前機器的網(wǎng)卡信息,如有多少個網(wǎng)卡,每個網(wǎng)卡的編號(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; //初始化邏輯網(wǎng)卡命令 ncb.ncb_lana_num = lana_enum.lana[lana]; uRetCode = Netbios(&ncb); memset(&ncb, 0, sizeof(ncb)); // 初始化ncbncb.ncb_command = NCBASTAT; // 執(zhí)行NCBASTAT命令ncb.ncb_lana_num = lana_enum.lana[lana]; // 設(shè)置LANA編號// 設(shè)置執(zhí)行NCBASTAT命令的參數(shù),將獲取到的網(wǎng)絡(luò)適配器數(shù)據(jù)保存到Adapter結(jié)構(gòu)體中strcpy((char*)ncb.ncb_callname, "*");//memcpy(&ncb.ncb_callname, "* ", 16);ncb.ncb_buffer = (UCHAR*)&Adapter;ncb.ncb_length = sizeof(Adapter);// 調(diào)用Netbios()函數(shù),執(zhí)行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; }

最終結(jié)果如下:

當(dāng)然,你也可以在代碼中加入自己想獲取的信息,如打印網(wǎng)卡數(shù)量,打印 Netbios() 返回值等。

最后貼兩篇我也不知道有沒有用的博客:

https://blog.csdn.net/pbl18392021230/article/details/72673417?utm_source=blogxgwz1
https://blog.csdn.net/qq_37711989/article/details/80877905

總結(jié)

以上是生活随笔為你收集整理的NetBIOS编程获取本机MAC地址及一个小坑的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。