#include <winsock2.h> //該頭文件定義了Socket編程的功能 #include <stdio.h> //該頭文件聲明了輸入輸出流函數 #include <stdlib.h> //該頭文件定義了一些通用函數 #include <httpext.h> //該頭文件支持HTTP請求 #include <windef.h> //該頭文件定義了Windows的所有數據基本型態 #include <Nb30.h> //該頭文件聲明了netbios的所有的函數 #pragma comment(lib,"ws2_32.lib") //連接ws2_32.lib庫.只要程序中用到Winsock API 函數,都要用到 Ws2_32.lib #pragma comment(lib,"netapi32.lib") //連接Netapi32.lib庫,MAC獲取中用到了NetApi32.DLL的功能 //CheckIP函數,用於獲取本機IP地址 void CheckIP(void) { WORD wVersionRequested;//WORD類型變量,用於存放Winsock版本的值 WSADATA wsaData;//存儲被WSAStartup函數調用后返回的Windows Sockets數據 char name[255];//用於存放主機名 PHOSTENT hostinfo; wVersionRequested = MAKEWORD(2,0);//調用2.0版 if (WSAStartup(wVersionRequested, &wsaData) == 0)//加載Winsock庫,如果WSAStartup()函數的返回值為0,說明加載成功 { if (gethostname(name, sizeof(name)) == 0)//如果成功,將本地主機名存放入由name參數指定的緩沖區中 { if ((hostinfo = gethostbyname(name)) != NULL)//獲取主機,如果獲得主機名成功的話,將返回一個指針,指向hostinfo { LPCSTR ip = inet_ntoa(*(struct in_addr *)*hostinfo->h_addr_list);//如果獲得主機名成功的話,調用inet_ntoa()取得IP地址 printf("本機的IP地址是:%s\n", ip);//輸出ip地址 printf("本機的名稱是:%s\n", name); } } WSACleanup(); } } //通過WindowsNT/Win2000中內置的NetApi32.DLL的功能來實現的。首先通過發送NCBENUM命令,獲取網卡的 //數目和每張網卡的內部編號,然后對每個網卡標號發送NCBASTAT命令獲取其MAC地址。 int getMAC(char * mac)//用NetAPI來獲取網卡MAC地址 { NCB ncb;//定義一個NCB(網絡控制塊)類型的結構體變量ncb typedef struct _ASTAT_//結構體ASTAT用於定義網絡適配器狀態和名字表信息 { ADAPTER_STATUS adapt;// 網絡適配器狀態 NAME_BUFFER NameBuff[30];//名字表信息 }ASTAT, *PASTAT; ASTAT Adapter;//適配器 typedef struct _LANA_ENUM//自定義一個結構體_LANA_ENUM { UCHAR length; UCHAR lana[MAX_LANA];//存放網卡MAC地址 }LANA_ENUM; LANA_ENUM lana_enum; //取得網卡信息列表 UCHAR uRetCode;//執行Netbios()函數的返回值 memset(&ncb,0,sizeof(ncb));//將已開辟內存空間ncb 的值均設為值 0 memset(&lana_enum,0,sizeof(lana_enum));//清空一個結構類型的變量lana_enum,賦值為0 //對結構體變量ncb賦值 ncb.ncb_command = NCBENUM;//統計系統中網卡的數量 ncb.ncb_buffer = (unsigned char *)&lana_enum; //ncb_buffer成員指向由LANA_ENUM結構填充的緩沖區 ncb.ncb_length = sizeof(LANA_ENUM); //向網卡發送NCBENUM命令,以獲取當前機器的網卡信息,如有多少個網卡,每個網卡的編號(MAC地址) uRetCode = Netbios(&ncb); //調用netbois(ncb)獲取網卡序列號 if (uRetCode != NRC_GOODRET) return uRetCode; //對每一個網卡,以其網卡編號為輸入編號,獲取其MAC地址 for (int lana = 0; lana<lana_enum.length; lana++) { ncb.ncb_command = NCBRESET;//對網卡發送NCBRESET命令,進行初始化 ncb.ncb_lana_num = lana_enum.lana[lana]; uRetCode = Netbios(&ncb); } if (uRetCode != NRC_GOODRET) return uRetCode; //准備取得接口卡的狀態塊取得MAC地址 memset(&ncb, 0, sizeof(ncb)); ncb.ncb_command = NCBASTAT;//對網卡發送NCBSTAT命令,獲取網卡信息 ncb.ncb_lana_num = lana_enum.lana[0];//指定網卡號,這里僅僅指定第一塊網卡 strcpy((char*)ncb.ncb_callname, "*");//遠程系統名賦值為* ncb.ncb_buffer = (unsigned char *)&Adapter;//指定返回的信息存放的變量 ncb.ncb_length = sizeof(Adapter); //接着發送NCBASTAT命令以獲取網卡的信息 uRetCode = Netbios(&ncb); //取得網卡的信息,並且如果網卡正常工作的話,返回標准的冒號分隔格式。 if (uRetCode != NRC_GOODRET) return uRetCode; //把網卡MAC地址格式轉化為常用的16進制形式,輸出到字符串mac中 sprintf(mac, "%02X-%02X-%02X-%02X-%02X-%02X", 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] ); return 0; } int main() { CheckIP();//調用CheckIP()函數獲得,輸出IP地址 char mac[200]; getMAC(mac);//調用getMAC()函數獲得,輸出MAC地址 printf(" mac地址 : %s /n", mac); return 0; }
