C++ | 获取主机名和IP地址
项目需求搞的一个函数,方便获取无线IP地址。
1 函数
/**
* 获取机器Ip地址和主机名
*/
bool getHostNameAndIp(std::string& strWLANIp, std::string& strLocalIp)
{
PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO();
//得到结构体大小,用于GetAdaptersInfo参数
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
int nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
//记录网卡数量
int netCardNum = 0;
//记录每张网卡上的IP地址数量
int IPnumPerNetCard = 0;
if (ERROR_BUFFER_OVERFLOW == nRel)
{
//如果函数返回的是ERROR_BUFFER_OVERFLOW
//则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小
//这也是说明为什么stSize既是一个输入量也是一个输出量
//释放原来的内存空间
delete pIpAdapterInfo;
//重新申请内存空间用来存储所有网卡信息
pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize];
//再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量
nRel = GetAdaptersInfo(pIpAdapterInfo, &stSize);
}
std::string strMAC;
strMAC.resize(20);
if (ERROR_SUCCESS == nRel)
{
//输出网卡信息
//可能有多网卡,因此通过循环去判断
while (pIpAdapterInfo)
{
//可能网卡有多IP,因此通过循环去判断
IP_ADDR_STRING *pIpAddrString = &(pIpAdapterInfo->IpAddressList);
if (pIpAddrString)
{
sprintf_s(const_cast<char*>(strMAC.c_str()), 20, "%02X-%02X-%02X-%02X-%02X-%02X",
pIpAdapterInfo->Address[0], pIpAdapterInfo->Address[1], pIpAdapterInfo->Address[2], pIpAdapterInfo->Address[3], pIpAdapterInfo->Address[4], pIpAdapterInfo->Address[5]);
//包含以下MAC地址的前8个字节(前3段)是虚拟网卡
//"00:05:69"; //vmware1
//"00:0C:29"; //vmware2
//"00:50:56"; //vmware3
//"00:1c:14"; //vmware4
//"00:1C:42"; //parallels1
//"00:03:FF"; //microsoft virtual pc
//"00:0F:4B"; //virtual iron 4
//"00:16:3E"; //red hat xen , oracle vm , xen source, novell xen
//"08:00:27"; //virtualbox
// 说明是本地网络
if (pIpAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
{
if (!strstr(pIpAdapterInfo->Description, "Virtual"))
{
std::string strIp = pIpAddrString->IpAddress.String;
if (strIp.compare("0.0.0.0") != 0)
{
strLocalIp = strIp;
}
}
}
// 说明是无线网络
if (pIpAdapterInfo->Type == 71)
{
std::string strIp = pIpAddrString->IpAddress.String;
if (strIp.compare("0.0.0.0") != 0)
{
strWLANIp = strIp;
}
}
}
pIpAdapterInfo = pIpAdapterInfo->Next;
}
}
return true;
}
2 使用方法
std::string ip, host;
if (!getHostNameAndIp(ip, host))
return false;
// ip即得到IP地址,host主机地址
std::cout<< ip<< " "<< host<< endl;