windows下用c++獲取本機ip地址的三種方法
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語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù)
這篇文章主要介紹了C語言如何利用ASCII碼表統(tǒng)計字符串每個字符出現(xiàn)的次數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
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é)進行了詳細的分析介紹,需要的朋友參考下2013-05-05

