Получение MAC-адреса проблемы Linux (Ubuntu) - PullRequest
0 голосов
/ 13 июля 2011

У меня есть MAC-адрес как под.

struct ifreq ifr;
struct ifreq *IFR;
struct ifconf ifc;
char buf[1024];
int s, i;
int ok = 0;
string macAddr = "";

s = socket(AF_INET, SOCK_DGRAM, 0);
if (s==-1) {
    return;
}

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s, SIOCGIFCONF, &ifc);

IFR = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) {

    strcpy(ifr.ifr_name, IFR->ifr_name);
    if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) {
        if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
            if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
                ok = 1;
                break;
            }
        }
    }
}

close(s);

int p = sizeof(ifr.ifr_hwaddr.sa_data);

cout<<"\n Size:"<<p<<"\n";

for(int i = 0; i < p; i++)
    macAddr += ifr.ifr_hwaddr.sa_data[i];

cout<<"\n MAC Address:"<<macAddr<<"\n";

У меня есть ifr.ifr_hwaddr.sa_data правильные данные, но когда я распечатываю, я не получаю правильное значение. Что может быть проблемой для этого.

1 Ответ

1 голос
/ 13 июля 2011

Адрес в sa_data не в текстовом виде, это необработанный двоичный формат, поэтому вам нужно отформатировать его как hex.Вы также не можете использовать sizeof, чтобы получить размер адреса, так как sa_data является массивом общего размера - вам нужно взглянуть на член sa_len, чтобы получить длину этого адреса.В C вы хотите что-то вроде этого:

char *separator = "";

for (int i = 0; i < ifr.ifr_hwaddr.sa_len; i++)
{
  printf("%s%02x", separator, ifr.ifr_hwaddr.sa_data[i]);
  separator = ":";
}

printf("\n");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...