//mac address dependency

#ifdef _WIN32

#include <WinSock.h>

#include <IPHlpApi.h>

#pragma comment(lib, "iphlpapi.lib" )

#else 

#include <sys/ioctl.h>

#include <net/if.h> 

#include <unistd.h>

#include <netinet/in.h>

#include <string.h>

#endif


#ifdef _WIN32

string CMacAddressHelper::getMacAddress()

{

char strMac[256] = { 0, };

DWORD size = (DWORD)sizeof(PIP_ADAPTER_INFO);


PIP_ADAPTER_INFO Info;

ZeroMemory(&Info, size);

int result = GetAdaptersInfo(Info, (PULONG)&size);    


if (result == ERROR_BUFFER_OVERFLOW)  

{

Info = (PIP_ADAPTER_INFO)malloc(size);

GetAdaptersInfo(Info, (PULONG)&size);

}

if (!Info)        

return string();


sprintf_s(strMac, "%0.2X-%0.2X-%0.2X-%0.2X-%0.2X-%0.2X",

Info->Address[0], Info->Address[1], Info->Address[2], Info->Address[3], Info->Address[4], Info->Address[5]);



return string(strMac);

}


#else //linux version

string CMacAddressHelper::getMacAddress()

{

struct ifreq ifr;

struct ifconf ifc;

char buf[1024] = { 0, };

int success = 0;


int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

if (sock == -1) { /* handle error*/ };


ifc.ifc_len = sizeof(buf);

ifc.ifc_buf = buf;

if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }


struct ifreq* it = ifc.ifc_req;

const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));


for (; it != end; ++it) {

strcpy(ifr.ifr_name, it->ifr_name);

if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {

if (!(ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback

if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {

success = 1;

break;

}

}

}

else { /* handle error */ }

}


//        char mac_address[6] = { 0, };

char strMac[256] = { 0, };

if (success)

//memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);

sprintf(strMac, "%0.2X-%0.2X-%0.2X-%0.2X-%0.2X-%0.2X",

ifr.ifr_hwaddr.sa_data[0], ifr.ifr_hwaddr.sa_data[1], ifr.ifr_hwaddr.sa_data[2], ifr.ifr_hwaddr.sa_data[3], ifr.ifr_hwaddr.sa_data[4], ifr.ifr_hwaddr.sa_data[5]);


return string(strMac);

}

#endif

//맥컴퓨터용은(...) 나도 사실 잘모름


#ifdef _WIN32

#include <WinSock.h>

#include <IPHlpApi.h>

#pragma comment(lib, "iphlpapi.lib" )

#else //linux

#include <sys/ioctl.h>

#include <net/if.h> 

#include <unistd.h>

#include <netinet/in.h>

#include <string.h>

#endif



using namespace std;


...


#ifdef _WIN32

string getMacAddress()

{

char strMac[256] = { 0, };

DWORD size = (DWORD)sizeof(PIP_ADAPTER_INFO);


PIP_ADAPTER_INFO Info;

ZeroMemory(&Info, size); //memset((void*)&info, 0, size);

int result = GetAdaptersInfo(Info, (PULONG)&size);    


if (result == ERROR_BUFFER_OVERFLOW)  

{

Info = (PIP_ADAPTER_INFO)malloc(size);

GetAdaptersInfo(Info, (PULONG)&size);

}

if (!Info)        

return string();


sprintf_s(strMac, "%0.2X-%0.2X-%0.2X-%0.2X-%0.2X-%0.2X",

Info->Address[0], Info->Address[1], Info->Address[2], Info->Address[3], Info->Address[4], Info->Address[5]);


return string(strMac);

}


#else //linux version

string getMacAddress()

{

struct ifreq ifr;

struct ifconf ifc;

char buf[1024] = { 0, };

int success = 0;


int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

if (sock == -1) { /* handle error*/ };


ifc.ifc_len = sizeof(buf);

ifc.ifc_buf = buf;

if (ioctl(sock, SIOCGIFCONF, &ifc) == -1) { /* handle error */ }


struct ifreq* it = ifc.ifc_req;

const struct ifreq* const end = it + (ifc.ifc_len / sizeof(struct ifreq));


for (; it != end; ++it) {

strcpy(ifr.ifr_name, it->ifr_name);

if (ioctl(sock, SIOCGIFFLAGS, &ifr) == 0) {

if (!(ifr.ifr_flags & IFF_LOOPBACK)) { // don't count loopback

if (ioctl(sock, SIOCGIFHWADDR, &ifr) == 0) {

success = 1;

break;

}

}

}

else { /* handle error */ }

}


        char mac_address[6] = { 0, };


if (success)

memcpy(mac_address, ifr.ifr_hwaddr.sa_data, 6);


return string(mac_address);

}

#endif

+ Recent posts