閒蕩了一個月,頭兒要求偶做個PXE的類比程式,首先第一步是要實現一個DHCP用戶端,這裡就牽涉到了一個讀取本機MAC,IP地址的問題,不想做文抄公,所以簡要說一下這裡主要是運用windows SDK中的函數GetAdapterInfo()來實現,該函數在標頭檔Iphlpapi.h中。
然後就是主要的實現過程,由於偶用的環境是code::block10.5,這裡說下環境配置的基本步驟:
依次進入Settings->Compiler and debugger->Linker settings,在Linker settings中的Link libraries中添加一個名為libiphlpapi.a的lib檔案。(ps:這裡有條使用codeblock時發現的小規律,就是在codeblock中添加的lib檔案一般就是vc裡面的檔案名稱前加個lib,然後副檔名變為a,除了這裡以外,比如說很有名的ws2_32.lib檔案,在codeblock中就是libws2_32.a)
添加完這個檔案之後就可以編寫了。
具體代碼如下所示:
#include <iostream><br />#include <string><br />#include <windows.h><br />#include <Iphlpapi.h><br />#include <stdio.h></p><p>using namespace std;</p><p> void GetMac()<br />{<br /> IP_ADAPTER_INFO *AdapterInfo; //定義網卡<br /> AdapterInfo=(IP_ADAPTER_INFO*) malloc(sizeof(IP_ADAPTER_INFO)); //分配空間<br /> ULONG dwBufLen=sizeof(IP_ADAPTER_INFO); //定義網卡大小<br /> DWORD status=GetAdaptersInfo(AdapterInfo,&dwBufLen); //擷取網卡資訊</p><p> /*<br /> 由於第一次調用GetAdaptersInfo()的時候容易產生錯誤,(錯誤111,搞了我好久~~~囧)<br /> 所以我們有意進行一次失敗調用,以確定適當的ulOutBufLen變數(緩衝區)大小,<br /> 以緩衝返回至pAdapterInfo的所有資料。這種方法是此類結構和函數的常用編程模式。<br /> */</p><p> if(status!=ERROR_SUCCESS) //第一次失敗調用<br /> {<br /> free(AdapterInfo);<br /> AdapterInfo = (IP_ADAPTER_INFO *) malloc (dwBufLen); //重新確定空間大小<br /> status=GetAdaptersInfo(AdapterInfo,&dwBufLen);<br /> }<br /> if(status!=ERROR_SUCCESS)<br /> {<br /> cout<<"getadaptersinof failed with:"<<status<<endl;<br /> }<br /> else<br /> {<br /> char mac[18];<br /> //整理一下mac地址的格式<br /> sprintf(mac,"%02x-%02x-%02x-%02x-%02x-%02x",AdapterInfo->Address[0],AdapterInfo->Address[1],AdapterInfo->Address[2],AdapterInfo->Address[3],AdapterInfo->Address[4],AdapterInfo->Address[5]);<br /> cout<<"ip address:"<<AdapterInfo->IpAddressList.IpAddress.String<<endl;<br /> cout<<"mac address:"<<mac<<endl;<br /> }</p><p> if(AdapterInfo)<br /> free(AdapterInfo);</p><p>}<br />
友情小貼士:
IP_ADAPTER_INFO結構體詳解:
typedef struct _IP_ADAPTER_INFO { </p><p> struct _IP_ADAPTER_INFO* Next; </p><p> DWORD ComboIndex; </p><p> char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4]; </p><p> char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4]; </p><p> UINT AddressLength; </p><p> BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH]; </p><p> DWORD Index; </p><p> UINT Type; </p><p> UINT DhcpEnabled; </p><p> PIP_ADDR_STRING CurrentIpAddress; </p><p> IP_ADDR_STRING IpAddressList; </p><p> IP_ADDR_STRING GatewayList; </p><p> IP_ADDR_STRING DhcpServer; </p><p> BOOL HaveWins; </p><p> IP_ADDR_STRING PrimaryWinsServer; </p><p> IP_ADDR_STRING SecondaryWinsServer; </p><p> time_t LeaseObtained; </p><p> time_t LeaseExpires; </p><p>} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO; </p><p>
運行結果: