1.windows 环境
#include <winsock2.h>
#include <iostream>
#include <iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib")
/**
* 获取机器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;
}
//调用方式
std::string ip, host;
getHostNameAndIp(ip, host);
//测试调用说明:
有线网链接网络时:host 为网络IP地址
无线网连接时:ip 为无线网ip.
转载来源https://blog.csdn.net/MissXy_/article/details/89550468
2.linux环境
#include <stdio.h>
#include <sys/types.h>
#include <ifaddrs.h>
#include <netinet/in.h>
#include <string>
#include <arpa/inet.h>
int main(int argc, const char * argv[]) {
struct ifaddrs * ifAddrStruct = NULL;
struct ifaddrs * ifa = NULL;
void * tmpAddrPtr = NULL;
getifaddrs(&ifAddrStruct);
for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
if (!ifa->ifa_addr) {
continue;
}
if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
// is a valid IP4 Address
tmpAddrPtr = &((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
char addressBuffer[INET_ADDRSTRLEN];
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
std::string ip = addressBuffer;
if (ip != "127.0.0.1")
{
printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer);
}
}
else if (ifa->ifa_addr->sa_family == AF_INET6) { // check it is IP6
// is a valid IP6 Address
tmpAddrPtr = &((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
char addressBuffer[INET6_ADDRSTRLEN];
inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer);
}
}
if (ifAddrStruct != NULL) freeifaddrs(ifAddrStruct);
return 0;
}
版权声明:本文为qq_37120714原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。