最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

windows下用c++獲取本機ip地址的三種方法

 更新時間:2023年11月19日 10:15:31   作者:WarmSword  
工作過程中遇到一個需求,需要獲取本機ip地址,同時獲取本機網(wǎng)絡連接情況,即網(wǎng)線是否連接,經(jīng)過多番搜索,本文給大家介紹了3種方案,通過代碼示例介紹的非常詳細,需要的朋友可以參考下

windows下用c++獲取本機ip地址

工作過程中遇到一個需求,需要獲取本機ip地址,同時獲取本機網(wǎng)絡連接情況,即網(wǎng)線是否連接。

經(jīng)過多番搜索,有如下3種方案。

1、管道+多進程

思路:在一個cmd中執(zhí)行ipconfig并獲取其輸出。

代碼如下:

#ifndef CMDEXC_H
#define CMDEXC_H

#include <string>


class CmdExc
{
public:
    CmdExc(std::string cmd,std::string mode="rt");
    virtual ~CmdExc();

    std::string getOutput() const;

private:
    std::string m_strOutput__;
    FILE* m_fp__;
};



CmdExc::CmdExc(std::string cmd, std::string mode)
{
    m_fp__=_popen(cmd.c_str(),mode.c_str());
    char buf[256]={0};
    if(NULL != m_fp__){
        int read_len;
        while((read_len=fread(buf,sizeof(buf)-1,1,m_fp__))>0){
            m_strOutput__+=buf;
            memset(buf,0,sizeof(buf));
        }
    }

}

CmdExc::~CmdExc()
{
    if(NULL != m_fp__){
        _pclose(m_fp__);
    }
}

std::string CmdExc::getOutput() const
{
    return m_strOutput__;
}

#endif // CMDEXC_H

調(diào)用處代碼

CmdExc cmd("ipconfig");
cout<<cmd.getOutput().c_str()<<endl;

缺點:

  • 多進程
  • 會有cmd的黑框一閃而過
  • 網(wǎng)線未插時無法獲取到ip配置
  • 很坑爹的在MFC工程中沒法用,必須是控制臺的應用。如win32工程,或者Qt工程下,都沒問題的。官方的解釋是窗口工程需要用CreateProcess來創(chuàng)建進程實現(xiàn)功能。

優(yōu)點:

  • 可以知道是否插了網(wǎng)線。。。。因為沒插就沒有顯示。。。

2、iphlpapi.lib

思路:使用iphlpapi庫

使用iphlpapi中的GetAdaptersInfo函數(shù)來獲取各個網(wǎng)卡的信息。

代碼如下:

代碼來自于官網(wǎng)msdn。個人稍加修改簡化。官方鏈接。

std::vector<string> IpDealer::getAdptInfo() {
    vector<string> result;
    IP_ADAPTER_INFO *pAdpFree=NULL;
    IP_ADAPTER_INFO *pIpAdpInfo=(IP_ADAPTER_INFO*)malloc(sizeof(IP_ADAPTER_INFO));
    unsigned long ulBufLen=sizeof(IP_ADAPTER_INFO);
    int ret;
    //第一次調(diào)用獲取需要開辟的內(nèi)存空間大小
    if((ret=GetAdaptersInfo(pIpAdpInfo,&ulBufLen))==ERROR_BUFFER_OVERFLOW){
        free(pIpAdpInfo);
        //分配實際所需要的內(nèi)存空間
        pIpAdpInfo=(IP_ADAPTER_INFO*)malloc(ulBufLen);
        if(NULL == pIpAdpInfo){
            return result;
        }
    }

    char ip[256];
    if((ret=GetAdaptersInfo(pIpAdpInfo,&ulBufLen))==NO_ERROR){
        pAdpFree=pIpAdpInfo;

        for(int i=0;pIpAdpInfo;i++){
            string addr;
            snprintf(ip,sizeof(ip),"netcard%d ip addr:",i);
            addr+=ip;
            IP_ADDR_STRING *pIps=&pIpAdpInfo->IpAddressList;
            while(pIps){
                snprintf(ip,sizeof(ip),"ip:%s,mask:%s,gate:%s.",pIps->IpAddress.String,
                         pIps->IpMask.String,pIpAdpInfo->GatewayList.IpAddress.String);
                addr+=ip;
                cout<<pIps->IpAddress.String<<endl;
                cout<<pIps->IpMask.String<<endl;
                cout<<pIpAdpInfo->GatewayList.IpAddress.String<<endl;
                pIps=pIps->Next;
            }
            result.push_back(addr);
            pIpAdpInfo=pIpAdpInfo->Next;
        }
    }
    if(pAdpFree){
        free(pAdpFree);
    }
    return result;

}

缺點:

  • 稍微有些復雜
  • 如果是vc6,默認是不帶iphlpapi.lib這個庫的。。。。需要手動安裝sdk。。。200來M。。。Qt5.2、vs2010均有這個庫。

優(yōu)點:

  • 可以知道網(wǎng)線連沒連,沒連,獲取到的是0.0.0.0。。。。

3、gethostbyname

思路:使用gethostbyname相關(guān)函數(shù)

代碼如下:

std::vector<std::string> IpDealer::getIpList()
{
    std::vector<std::string> result;
    char name[256];

    int getNameRet=gethostname(name,sizeof(name));

    hostent *host=gethostbyname(name);

    if(NULL == host){
        return result;
    }

    in_addr *pAddr=(in_addr*)*host->h_addr_list;

    for(int i=0;i<(strlen((char*)*host->h_addr_list)-strlen(host->h_name) )/4 && pAddr;i++){
        string addr=inet_ntoa(pAddr[i]);
        cout<<addr.c_str()<<endl;
        result.push_back(addr);
    }

    return result;
}

缺點:

  • 網(wǎng)線沒插時獲取到的ip是127.0.0.1。
  • 獲取ip個數(shù)時不夠清晰,因為hostent結(jié)構(gòu)中h_addr_list是一個\0結(jié)尾的字符串,但是長度不是4的整數(shù)倍。。。。。因為最后附加了hostname字符串。。。。但是官網(wǎng)并未明說。。。我是從代碼中斷點看出來的。。。稍微有些坑

優(yōu)點:

  • 實現(xiàn)較簡單

詳細源代碼見我的gitee。

以上就是windows下用c++獲取本機ip地址的三種方法的詳細內(nèi)容,更多關(guān)于c++獲取本機ip地址的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++ 移動構(gòu)造相關(guān)總結(jié)

    c++ 移動構(gòu)造相關(guān)總結(jié)

    這篇文章主要介紹了c++ 移動構(gòu)造的相關(guān)資料,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下
    2021-02-02
  • 一起來看看C語言線性表的線性鏈表

    一起來看看C語言線性表的線性鏈表

    這篇文章主要為大家詳細介紹了C語言線性表的線性鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 基于Qt實現(xiàn)可拖動自定義控件

    基于Qt實現(xiàn)可拖動自定義控件

    這篇文章主要為大家詳細介紹了如何基于Qt實現(xiàn)可拖動自定義控件,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù)

    C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù)

    這篇文章主要介紹了C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • C/C++實現(xiàn)目錄監(jiān)視器的方法詳解

    C/C++實現(xiàn)目錄監(jiān)視器的方法詳解

    這篇文章主要介紹了C/C++ 實現(xiàn)目錄監(jiān)視器的方法,然后網(wǎng)上查到的基本就有三種方法,使用FindFirstChangeNotification等系列函數(shù),使用ReadDirectoryChangesW函數(shù)和使用change journals,本文使用了第二種方式來實現(xiàn)一個目錄監(jiān)視,需要的朋友可以參考下
    2024-04-04
  • C/C++中宏/Macro的深入講解

    C/C++中宏/Macro的深入講解

    這篇文章主要給大家介紹了關(guān)于C/C++中宏/Macro的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C/C++具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-06-06
  • C語言文件操作詳情(一)

    C語言文件操作詳情(一)

    這篇文章主要介紹了C語言文件操作詳情,主要討論的是數(shù)據(jù)文件,通過處理的磁盤上的文件展開主題內(nèi)容介紹,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-04-04
  • Qt數(shù)據(jù)庫應用之實現(xiàn)通用數(shù)據(jù)庫采集

    Qt數(shù)據(jù)庫應用之實現(xiàn)通用數(shù)據(jù)庫采集

    這篇文章主要為大家介紹了Qt中是如何實現(xiàn)通用數(shù)據(jù)庫采集的,文中的示例代碼講解詳細,對我們學習Qt有一定幫助,感興趣的小伙伴可以了解一下
    2022-03-03
  • 基于linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)

    基于linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)

    本篇文章是對linux下C開發(fā)中的幾點技術(shù)經(jīng)驗總結(jié)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • Qt可視化大屏布局的實現(xiàn)

    Qt可視化大屏布局的實現(xiàn)

    數(shù)據(jù)可視化大屏在項目中的使用很常見,本文主要介紹了Qt可視化大屏布局的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-02-02

最新評論

承德县| 黔江区| 吴桥县| 那坡县| 怀集县| 根河市| 特克斯县| 交口县| 云霄县| 增城市| 当阳市| 平昌县| 杂多县| 乳源| 湖州市| 乐都县| 廊坊市| 新乡县| 通州区| 长乐市| 浦北县| 资兴市| 乳源| 鄯善县| 自治县| 开江县| 武平县| 德清县| 偏关县| 师宗县| 静安区| 元谋县| 井陉县| 岐山县| 锡林浩特市| 友谊县| 金山区| 噶尔县| 宝山区| 任丘市| 巢湖市|