千家信息网

linux 获取本机MAC/IP地址的方法

发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,功能:查询本机IP/MAC地址,过滤掉127.0.0.1 loop-back 地址适用:linux, ubuntu 16.04 调试通过#include #include #include #incl
千家信息网最后更新 2024年10月10日linux 获取本机MAC/IP地址的方法

功能:查询本机IP/MAC地址,过滤掉127.0.0.1 loop-back 地址

适用:linux, ubuntu 16.04 调试通过


#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include



void getLocalMacIp()

{

int i;
int sock_mac;
char hname[128];
struct hostent *hent;
struct in_addr *paddr = 0;
struct ifaddrs * ifAddrStruct=NULL;
struct ifreq ifr_mac;
void * tmpAddrPtr=NULL;

struct ifreq buf[16];
struct ifconf ifc;
int interface_num;
char nif_name[128] = {0};
char addressBuffer[128];

unsigned char macaddr[6] = {0};
unsigned char *pFirstByte;

//---------------------------------------------
//get device IP address, discard loopback
//---------------------------------------------
gethostname(hname, sizeof(hname));

hent = gethostbyname(hname);

printf("[%s][%d] host: %s\n", __FILE__, __LINE__, hent->h_name);

getifaddrs(&ifAddrStruct);

while (ifAddrStruct!=NULL)
{
if (ifAddrStruct->ifa_addr->sa_family==AF_INET)
{
tmpAddrPtr = &((struct sockaddr_in *)ifAddrStruct->ifa_addr)->sin_addr;
pFirstByte = (unsigned char*)tmpAddrPtr;

if(*pFirstByte != 127)
{
paddr = tmpAddrPtr;
inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, 128);
printf("[%s][%d] NIF %s address %s\n", __FILE__, __LINE__,
ifAddrStruct->ifa_name, addressBuffer);
//---------------------------------------------
//remember NIF name for future use
//---------------------------------------------
strcpy(nif_name, ifAddrStruct->ifa_name);
}

}

ifAddrStruct=ifAddrStruct->ifa_next;
}


//---------------------------------------------
//get device MAC address, discard loopback
//---------------------------------------------
sock_mac = socket( AF_INET, SOCK_DGRAM, 0 );

if(sock_mac > 0)
{
ifc.ifc_len = sizeof(buf);
ifc.ifc_req = buf;
ioctl(sock_mac, SIOCGIFCONF, (char *)&ifc);

interface_num = ifc.ifc_len / sizeof(struct ifreq);

while(interface_num--)
{
if(nif_name[0] && strcmp(nif_name, buf[interface_num].ifr_name))
{
continue;
}

ioctl(sock_mac, SIOCGIFHWADDR, (char *)&buf[interface_num]);

memcpy(macaddr, &buf[interface_num].ifr_hwaddr.sa_data[0], 6);

//printf("NIF %s ", buf[interface_num].ifr_name);
//printf("mac x:x:x:x:x:x \n",
// macaddr[0], macaddr[1], macaddr[2], macaddr[3], macaddr[4], macaddr[5]);
}

close( sock_mac );
}
}

0