Здравствуйте, 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 адреса нет...не подскажите что делать?