獲取本機mac地址


#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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM