Re[2]: Нужен универсальный способ определения MAC адреса
От: Andryu  
Дата: 04.05.06 12:53
Оценка:
Здравствуйте, ServerMouse, Вы писали:

SM>А ещё можно прочитать MAC из таблицы MAC<->IP (конечно только для IP-семейства протоколов).

SM>В NT есть SendARP. В 9х нет. Универсальный способ для такого случая заключается IMHO в такой последовательности:

SM>1. По известному IP-адресу шлём какой-нибудь пакет (не принципиально UDP, TCP, ICMP,etc). Для доставки пакета система ДОЛЖНА знать MAC. И обязательно определит его, занеся в ARP-таблицу соответствие IP<->MAC.

SM>2. Убедившись что пакет ГОТОВ к отправке (блокирующие сокеты например) мы спокойненько забираем MAC из ARP-таблицы. Там будет лежать MAC хоста или шлюза к нему.
SM>Из ARP-таблицы вытягиваем примерно так:

SM>
SM>bool GetHostMAC(void *MAC, DWORD _ip)
SM>{    
SM>  MIB_IPNETTABLE * pIpNetTable = (MIB_IPNETTABLE *) new char[0xFFFF];
SM>  ULONG cbIpNetTable = 0xFFFF;
SM>  if (NO_ERROR == GetIpNetTable (pIpNetTable, &cbIpNetTable, TRUE))
SM>  {
SM>    for (DWORD i = 0; i < pIpNetTable->dwNumEntries; i++)
SM>    {
SM>      if(pIpNetTable->table[i].dwAddr==_ip&&pIpNetTable->table[i].dwType!=2)
SM>      {
SM>         memcpy(MAC,pIpNetTable->table[i].bPhysAddr,6);
SM>         delete[] pIpNetTable;
SM>         return true;
SM>      }
SM>    }
SM>    delete[] pIpNetTable;
SM>  }    
SM> return false;
SM>}
SM>

А как быть в том случае если нужен MAC локального компа, отсылаешь пакет сам себе, а в таблице MAC адреса нет...не подскажите что делать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.