windows編程獲取網(wǎng)卡和IP

一臺機器上可能不只有一個網(wǎng)卡晶默,但每一個網(wǎng)卡只有一個MAC地址矛洞,而每一個網(wǎng)卡可能配置有多個IP地址微姊;如平常的筆記本電腦中酸茴,就會有無線網(wǎng)卡和有線網(wǎng)卡(網(wǎng)線接口)兩種;因此兢交,如果要獲得本機所有網(wǎng)卡的IP和MAC地址信息薪捍,則必須順序獲得每個網(wǎng)卡,再依次獲取其信息等配喳;在windows sdk中酪穿,用IP_ADAPTER_INFO結(jié)構(gòu)體存儲網(wǎng)卡信息,包括網(wǎng)卡名晴裹、網(wǎng)卡描述被济、網(wǎng)卡MAC地址、網(wǎng)卡IP等涧团,該結(jié)構(gòu)體的主要描述如下所示:

            typedef struct _IP_ADAPTER_INFO {
            struct _IP_ADAPTER_INFO* Next;//指向鏈表中下一個適配器信息的指針
            DWORD ComboIndex;//預(yù)留值
            char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];//使用ANSI字符串表示的適配器名稱
            char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];//使用ANSI字符串表示的適配器描述
            UINT AddressLength;//適配器硬件地址以字節(jié)計算的長度
            BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];//硬件地址以BYTE數(shù)組所表示
            DWORD Index;//適配器索引
                    UINT Type;//適配器類型,主要有以下幾種:
                    /*
                    *   MIB_IF_TYPE_OTHER     1
                    *   MIB_IF_TYPE_ETHERNET     6
                    *   MIB_IF_TYPE_TOKENRING     9
                    *   MIB_IF_TYPE_FDDI     15
                    *   MIB_IF_TYPE_PPP     23
                    *   MIB_IF_TYPE_LOOPBACK      24
                    *   MIB_IF_TYPE_SLIP      28
                    */
            UINT DhcpEnabled;//指定這個適配器是否開啟DHCP
            PIP_ADDR_STRING CurrentIpAddress;//預(yù)留值
            IP_ADDR_STRING IpAddressList;//該適配器的IPv4地址鏈表
            IP_ADDR_STRING GatewayList;//該適配器的網(wǎng)關(guān)IPv4地址鏈表
            IP_ADDR_STRING DhcpServer;//該適配器的DHCP服務(wù)器的IPv4 地址鏈表
            BOOL HaveWins;
            IP_ADDR_STRING PrimaryWinsServer;
            IP_ADDR_STRING SecondaryWinsServer;
            time_t LeaseObtained;
            time_t LeaseExpires;
            } IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;

由于可能有多個網(wǎng)卡溉潭,因此struct _IP_ADAPTER_INFO* Next字段為一個鏈表結(jié)構(gòu)指針净响,由于一個網(wǎng)卡可能有多個IP,因此IP_ADDR_STRING字段應(yīng)該也是一個鏈表結(jié)構(gòu)喳瓣,其信息如下所示:

    typedef struct _IP_ADDR_STRING
    {
            struct _IP_ADDR_STRING* Next;  //指向同類型節(jié)點馋贤,即下一個IP(如果有多IP的話)
            IP_ADDRESS_STRING IpAddress;  //IP地址信息
            IP_MASK_STRING IpMask; //IP子網(wǎng)掩碼
            DWORD Context;// 網(wǎng)絡(luò)表入口。這個值對應(yīng)著AddIPAddredd和DeleteIPAddress函數(shù)中的NTEContext參數(shù)
    } IP_ADDR_STRING;

在基本了解以上信息后畏陕,就可以調(diào)用GetAdaptersInfo函數(shù)來獲取相關(guān)網(wǎng)卡信息了配乓,其通用的代碼如下所示:

                    #include <WinSock2.h>
                    #include <Iphlpapi.h>
                    #include <iostream>
                    using namespace std;
                    #pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib庫
                    int main(int argc, char* argv[])
                    {
                            //PIP_ADAPTER_INFO結(jié)構(gòu)體指針存儲本機網(wǎng)卡信息
                            PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
                            //得到結(jié)構(gòu)體大小,用于GetAdaptersInfo參數(shù)
                            unsigned long stSize = sizeof(IP_ADAPTER_INFO);
                            //調(diào)用GetAdaptersInfo函數(shù),填充pIpAdapterInfo指針變量;其中stSize參數(shù)既是一個輸入量也是一個輸出量
                            int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize);
                            //記錄網(wǎng)卡數(shù)量
                            int netCardNum = 0;
                            //記錄每張網(wǎng)卡上的IP地址數(shù)量
                            int IPnumPerNetCard = 0;
                            if (ERROR_BUFFER_OVERFLOW == nRel)
                            {
                                    //如果函數(shù)返回的是ERROR_BUFFER_OVERFLOW
                                    //則說明GetAdaptersInfo參數(shù)傳遞的內(nèi)存空間不夠,同時其傳出stSize,表示需要的空間大小
                                    //這也是說明為什么stSize既是一個輸入量也是一個輸出量
                                    //釋放原來的內(nèi)存空間
                                    delete pIpAdapterInfo;
                                    //重新申請內(nèi)存空間用來存儲所有網(wǎng)卡信息
                                    pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
                                    //再次調(diào)用GetAdaptersInfo函數(shù),填充pIpAdapterInfo指針變量
                                    nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize);    
                            }
                            if (ERROR_SUCCESS == nRel)
                            {
                                    //輸出網(wǎng)卡信息
                                    //可能有多網(wǎng)卡,因此通過循環(huán)去判斷
                            while (pIpAdapterInfo)
                            {
                                    cout<<"網(wǎng)卡數(shù)量:"<<++netCardNum<<endl;
                                    cout<<"網(wǎng)卡名稱:"<<pIpAdapterInfo->AdapterName<<endl;
                                    cout<<"網(wǎng)卡描述:"<<pIpAdapterInfo->Description<<endl;
                                    switch(pIpAdapterInfo->Type)
                                    {
                                    case MIB_IF_TYPE_OTHER:
                                            cout<<"網(wǎng)卡類型:"<<"OTHER"<<endl;
                                            break;
                                    case MIB_IF_TYPE_ETHERNET:
                                            cout<<"網(wǎng)卡類型:"<<"ETHERNET"<<endl;
                                            break;
                                    case MIB_IF_TYPE_TOKENRING:
                                            cout<<"網(wǎng)卡類型:"<<"TOKENRING"<<endl;
                                            break;
                                    case MIB_IF_TYPE_FDDI:
                                            cout<<"網(wǎng)卡類型:"<<"FDDI"<<endl;
                                            break;
                                    case MIB_IF_TYPE_PPP:
                                            printf("PP\n");
                                            cout<<"網(wǎng)卡類型:"<<"PPP"<<endl;
                                            break;
                                    case MIB_IF_TYPE_LOOPBACK:
                                            cout<<"網(wǎng)卡類型:"<<"LOOPBACK"<<endl;
                                            break;
                                    case MIB_IF_TYPE_SLIP:
                                            cout<<"網(wǎng)卡類型:"<<"SLIP"<<endl;
                                            break;
                                    default:
                    break;
                                    }
                                    cout<<"網(wǎng)卡MAC地址:";
                                    for (DWORD i = 0; i < pIpAdapterInfo->AddressLength; i++)
                                            if (i < pIpAdapterInfo->AddressLength-1)
                                            {
                                                    printf("%02X-", pIpAdapterInfo->Address[i]);
                                            }
                                            else
                                            {
                                                    printf("%02X\n", pIpAdapterInfo->Address[i]);
                                            }
                                            cout<<"網(wǎng)卡IP地址如下:"<<endl;
                                            //可能網(wǎng)卡有多IP,因此通過循環(huán)去判斷
                                            IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList);
                                            do 
                                            {
                                                    cout<<"該網(wǎng)卡上的IP數(shù)量:"<<++IPnumPerNetCard<<endl;
                                                    cout<<"IP 地址:"<<pIpAddrString->IpAddress.String<<endl;
                                                    cout<<"子網(wǎng)地址:"<<pIpAddrString->IpMask.String<<endl;
                                                    cout<<"網(wǎng)關(guān)地址:"<<pIpAdapterInfo->GatewayList.IpAddress.String<<endl;
                                                    pIpAddrString=pIpAddrString->Next;
                                            } while (pIpAddrString);
                                            pIpAdapterInfo = pIpAdapterInfo->Next;
                                            cout<<"--------------------------------------------------------------------"<<endl;
                            }
                            
                            }
                            //釋放內(nèi)存空間
                            if (pIpAdapterInfo)
                            {
                                    delete pIpAdapterInfo;
                            }
                    
                            return 0;
                    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惠毁,隨后出現(xiàn)的幾起案子犹芹,更是在濱河造成了極大的恐慌,老刑警劉巖鞠绰,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰埂,死亡現(xiàn)場離奇詭異,居然都是意外死亡蜈膨,警方通過查閱死者的電腦和手機屿笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翁巍,“玉大人驴一,你說我怎么就攤上這事≡詈” “怎么了肝断?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驰凛。 經(jīng)常有香客問我胸懈,道長,這世上最難降的妖魔是什么恰响? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任箫荡,我火速辦了婚禮,結(jié)果婚禮上渔隶,老公的妹妹穿的比我還像新娘羔挡。我一直安慰自己,他們只是感情好间唉,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布绞灼。 她就那樣靜靜地躺著,像睡著了一般呈野。 火紅的嫁衣襯著肌膚如雪低矮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天被冒,我揣著相機與錄音军掂,去河邊找鬼轮蜕。 笑死,一個胖子當(dāng)著我的面吹牛蝗锥,可吹牛的內(nèi)容都是我干的跃洛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淘这?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤细燎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后皂甘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玻驻,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年偿枕,在試婚紗的時候發(fā)現(xiàn)自己被綠了璧瞬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡益老,死狀恐怖彪蓬,靈堂內(nèi)的尸體忽然破棺而出寸莫,到底是詐尸還是另有隱情捺萌,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布膘茎,位于F島的核電站桃纯,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏披坏。R本人自食惡果不足惜态坦,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棒拂。 院中可真熱鬧伞梯,春花似錦、人聲如沸帚屉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽攻旦。三九已至喻旷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牢屋,已是汗流浹背且预。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工槽袄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人锋谐。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓遍尺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親怀估。 傳聞我的和親對象是個殘疾皇子狮鸭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • LT-0807,2018.03.11翻譯多搀,@成都 聲明 本文是一篇關(guān)于TCP/IP協(xié)議組件的RFC歧蕉,聚焦于一個IP...
    摩訶婆羅多閱讀 4,084評論 1 5
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,129評論 25 707
  • 母親,愛如潮水康铭,溫暖又柔和惯退。 她用自己的血肉孕育一個生命,用鮮血化為奶水哺育新生的孩子从藤。 如果說催跪,母親不愛孩子,不...
    攸寧er閱讀 319評論 0 4
  • 【日更118】 今年的NBA總冠軍新鮮出爐了夷野,金州勇士隊懊蒸。 我卻一場比賽都沒看,雖然總決賽開打之前才剛看過比賽的日...
    唐斬2086閱讀 354評論 0 1