Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

MAC from IP


Qwertyk ©   (2005-03-21 22:15:00) 

Как получить мак адрес по IP?


Alex Konshin   (2005-03-22 23:57:00) [1]

Хуже - компьютер отключен.

Разница динамические/статические в том, что в случае динIP сам IP вообще не имеет смысла для отключенного компьютера, ведь при каждом включении он получает новый IP. Для статического я еще как-то могу представить ситуацию, что MAC-адрес где-то закешировался и мы его получили хотя компьютер выключен.


Piter   (2005-03-22 17:44:00) [2]

GLFox ©   (22.03.05 16:56) [7]
Result


а если NetBios на компьютере отключен?


GLFox   (2005-03-22 16:56:00) [3]

Я использую такую вот функцию для получения MAC:

function GetHostInfoNB(sHostName:String; iInfoTypes:Integer):String;
var
 NCB:TNCB;
 i,iLen,iResCode:Integer;
 pAStat:^TAStat;
begin
 Result:='';
 if (sHostName='')or(sHostName=sLocalHostName) then sHostName:='*' else
   while (Length(sHostName)>0)and(sHostName[1]='\') do Delete(sHostName,1,1);
 FillChar(NCB,SizeOf(NCB),0);
 Ncb.ncb_command:=NCBRESET;
 Netbios(@NCB);
 FillChar(NCB,SizeOf(NCB),0);
 Ncb.ncb_command:=NCBASTAT;
 Ncb.ncb_lana_num:=0;
 New(pAStat);
 Ncb.ncb_buffer:=pAStat;
 Ncb.ncb_length:=SizeOf(TAStat);
 iLen:=Length(sHostName);
 for i:=0 to NCBNAMSZ-1 do
   if i<iLen then Ncb.ncb_callname[i]:=sHostName[i+1]
   else Ncb.ncb_callname[i]:=' ';
 iResCode:=Netbios(@NCB);
 if iResCode = 0 then begin
   if (nbiMACAddr and iInfoTypes) = nbiMACAddr then
     with pAStat^.adapt do begin
       Result:=Format('%.2x %.2x %.2x %.2x %.2x %.2x',
                     [adapter_address[0], adapter_address[1], adapter_address[2],
                      adapter_address[3], adapter_address[4], adapter_address[5]]);
     end;
   if (nbiGrpName and iInfoTypes) = nbiGrpName then begin
     if Result<>'' then Result:=Result+#0;
     for i:=0 to pAStat^.adapt.name_count-1 do
       if (pAStat^.NameBuff[i].name_flags and GROUP_NAME) = GROUP_NAME then begin
         Result:=Result+pAStat^.NameBuff[i].name;
         Break;
       end;
   end;
 end else AddEventToLog(etErrorInter,0,'NetBIOS error ('+sHostName+')');
 Dispose(pAStat);

где

TAStat=record
 adapt    : TAdapterStatus;
 NameBuff : array[0..29]of TNameBuffer;
end;


Piter   (2005-03-22 16:51:00) [4]

Alex Konshin ©   (22.03.05 3:56) [4]
Мне вот и интересно, а будет ли кому на них отвечать, если компьютер выключен?


по-моему, нет

Alex Konshin ©   (22.03.05 3:56) [4]
Ищи в MSDN в IP Helper API функцию SendARP


верно - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iphlp/iphlp/sendarp.asp

Но это для w2k/XP/2003

Для Win9x можно обратиться к узлу (например, пропинговать) и в ARP таблице искать соответствие IP-MAC (если пинг прошел, оно там должно быть)

Alex Konshin ©   (22.03.05 4:15) [5]
Спрашивал про статические адреса потому, что ARP кешируются


насколько я помню, не более, чем на минуту другую

Если же еще и адреса динамические, то я вообще не понимаю, о каком IP идет речь

а какая разница - статические или динамические адреса?! Просто в локалкее пытаются определить MAC сетевой карточки по IP адресу. Причем здест статика, динамика?


Alex Konshin   (2005-03-22 04:15:00) [5]

Да, для тех, кто не понял. Спрашивал про статические адреса потому, что ARP кешируются, поэтому теоретически можно получить MAC того, чего уже нет (выключено). Если же еще и адреса динамические, то я вообще не понимаю, о каком IP идет речь.


Alex Konshin   (2005-03-22 03:56:00) [6]

А у тебя IP в локалке статические? А то как бы не вышло, что ты определяешь MAC адрес по IP для выключенного компьютера, да еще и не того.
MAC по IP определяется посылкой пакетов ARP. Мне вот и интересно, а будет ли кому на них отвечать, если компьютер выключен? Не, я правда не знаю. Могу и ошибаться.

Попробуй, может, и зря я пугаю. Ищи в MSDN в IP Helper API функцию SendARP, если мне память не изменяет, ну или что-то рядом с ней.


Piter   (2005-03-21 23:50:00) [7]

а система какая?


Qwertyk   (2005-03-21 23:46:00) [8]

хмм..
есть программа lanstartcmd, для включения компьютера по локальной стеи. Так вот мне нужно сделать для нее оболочку. Нужно определить МАК адрес компьютера по IP в локальной сети..


Piter   (2005-03-21 23:15:00) [9]

а зачем?


Наверх

Титульная страница Поиск, карта сайта Написать письмо