Re: Нужен универсальный способ определения MAC адреса
От: ServerMouse Беларусь  
Дата: 24.02.02 18:03
Оценка:
А ещё можно прочитать MAC из таблицы MAC<->IP (конечно только для IP-семейства протоколов).
В NT есть SendARP. В 9х нет. Универсальный способ для такого случая заключается IMHO в такой последовательности:

1. По известному IP-адресу шлём какой-нибудь пакет (не принципиально UDP, TCP, ICMP,etc). Для доставки пакета система ДОЛЖНА знать MAC. И обязательно определит его, занеся в ARP-таблицу соответствие IP<->MAC.
2. Убедившись что пакет ГОТОВ к отправке (блокирующие сокеты например) мы спокойненько забираем MAC из ARP-таблицы. Там будет лежать MAC хоста или шлюза к нему.
Из ARP-таблицы вытягиваем примерно так:

bool GetHostMAC(void *MAC, DWORD _ip)
{    
  MIB_IPNETTABLE * pIpNetTable = (MIB_IPNETTABLE *) new char[0xFFFF];
  ULONG cbIpNetTable = 0xFFFF;
  if (NO_ERROR == GetIpNetTable (pIpNetTable, &cbIpNetTable, TRUE))
  {
    for (DWORD i = 0; i < pIpNetTable->dwNumEntries; i++)
    {
      if(pIpNetTable->table[i].dwAddr==_ip&&pIpNetTable->table[i].dwType!=2)
      {
         memcpy(MAC,pIpNetTable->table[i].bPhysAddr,6);
         delete[] pIpNetTable;
         return true;
      }
    }
    delete[] pIpNetTable;
  }    
 return false;
}
Если человек программист, то это надолго.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.