опубликован 03-12-2001 10:10 MSK
Ну во первых NetBIOS. Технология проста -- посылаем запрос через NetBios, ежели нас послали (нет там например нетбиоса) вытаскиваем адрес из ARP-таблицы (если хост вообще существует, то после отправки нетбиосной месаги он должен быть занесён в табл. ARP).
Примерно так:bool GetHostMAC(void *MAC, const char *HostName, DWORD _ip)
{
NCB SNcb;
UCHAR rc = 0;
UCHAR Status[256];
memset( &SNcb, 0, sizeof(SNcb) );
SNcb.ncb_command = NCBRESET;
SNcb.ncb_lana_num = 0;
rc=Netbios( &SNcb ); //Сбросили NetBIOS
char Name[255];
strcpy(Name,HostName);
while( lstrlen(Name) - 15)
lstrcat(Name, " ");
memset(&SNcb, 0, sizeof(NCB));
SNcb.ncb_command = NCBASTAT;
SNcb.ncb_buffer = (unsigned char*)Status;
SNcb.ncb_length = 256;
lstrcpy((char*)SNcb.ncb_callname, Name);
SNcb.ncb_lana_num = 0;//lana_num;
rc = Netbios( &SNcb );
if(rc==NRC_GOODRET)
{
memcpy(MAC,Status,6); //Получили MAC через NetBIOS
return true;
}
else
{
if(_ip!=0) //Ладно, придётся достать его из ARP...
{ //Конечно если нам известен его 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; //Нда... Скорее всего такого компа нет.
}
}