А ещё можно прочитать 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;
}