Использование raw socket для доступа к MAC-адресу Ethernet через структуру [duplicate]

В соответствии с документацией вместо

execfile("./filename") 

Используйте

exec(open("./filename").read())

См.:

1
задан unwind 24 November 2010 в 10:08
поделиться

3 ответа

Что-то вроде этого должно это сделать:

char mac[6 * 2 + 5 + 1];

for(size_t i = 0, pos = 0; i < sizeof ethernet->ether_dhost; i++)
{
  if(i > 0)
   mac[pos++] = ':';
  sprintf(mac + pos, "%02x", (unsigned int) ethernet->ether_dhost[i] & 0xffu);
}

Это также вставляет двоеточия между каждым байтом, поэтому вывод будет выглядеть как DE:AD:BE:EF:BA:BE, который как MAC-адреса обычно форматируются для Ethernet.

2
ответ дан unwind 21 August 2018 в 00:42
поделиться

Как насчет:

printf("%02x:%02x:%02x:%02x:%02x:%02x",
    (unsigned)ethernet->ether_dhost[0],
    (unsigned)ethernet->ether_dhost[1],
    (unsigned)ethernet->ether_dhost[2],
    (unsigned)ethernet->ether_dhost[3],
    (unsigned)ethernet->ether_dhost[4],
    (unsigned)ethernet->ether_dhost[5]);
5
ответ дан caf 21 August 2018 в 00:42
поделиться
  • 1
    +1, более идиоматический, чем цикл (вы можете сказать, что это MAC-адрес с быстрым взглядом). – ninjalj 25 November 2010 в 00:02

Я думаю, лучший способ - использовать ether_ntoa (), который доступен практически для любой операционной системы * nix (доступной в net / ethernet.h). Для меня это хорошо работает.

char *addr;
struct ether_addr host;

memcpy(&host, ethernet->ether_dhost, sizeof(host));
addr = ether_ntoa(&host);
5
ответ дан Joe Boo 21 August 2018 в 00:42
поделиться
  • 1
    Он, по-видимому, доступен в & lt; netinet / ether.h & gt; на платформах Linux. – Frank 12 March 2012 в 11:51
Другие вопросы по тегам:

Похожие вопросы: