Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.07;
Скачать: CL | DM;

Вниз

MAC адрес   Найти похожие ветки 

 
MeMO   (2004-08-29 22:13) [0]

Люди, подскажите как определить MAC удаленного компа. Мне сказали что это делается зерез NetBios() только я с ней разобраться немогу.


 
VID ©   (2004-08-30 00:56) [1]

хошь пример на С++ ?
http://www.sources.ru/cpp/faqs/1.htm

может кто-нибудь тебе портирует код на дельфи, лично я С++ не знаю, а вообще ya.ru рулит ;)


 
Verg ©   (2004-08-30 00:57) [2]


> Люди, подскажите как определить MAC удаленного компа.


Из каких исходных данных? Что известно про "удаленный комп", кроме того, что он "удаленный"?


 
Verg ©   (2004-08-30 01:23) [3]

Цитата оттуда:
"Технология следующая: мы посыалем хосту любой IP-пакет, например по UDP. Система обязательно широковещательным ARP-пакетом запросит его MAC-адрес и если получит, занесёт его в таблицу IPMAC. Откуда мы его и заберём."

Все верно, но...

Тут надо поправить, на мой взгляд:
".... и, когда (и если) получит, занесёт..."

А вот "когда" (через какое время) - этот вопрос как-то ускользнул от составителя того кода.

Другими словами, сколько пройдет времени с момента (по тому коду)
с момента   sendto
до момента GetIpNetTable ?

И хватит ли этого времени, чтобы системе отправить в сеть ARP запрос и получить ARP ответ?


 
Verg ©   (2004-08-30 01:28) [4]

А вообще-то существует ф-ция SendARP (iphlpip.dll)

function SendARP(DestIP:DWORD;SrcIP:DWORD; var pMacAddr; var PhyAddrLen:DWORD):DWORD;stdcall;

implementation

function   SendARP;          external "IPHLPAPI.DLL";


 
Дмитрий Ботвин   (2004-08-30 09:10) [5]

Вот лови код:

//Преобразование Mac-адреса к превычному виду
function AdapterToString(Adapter: TAdapterStatus): string;
 begin
   with Adapter do Result :=
      Format("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x",
      [Integer(adapter_address[0]), Integer(adapter_address[1]),
      Integer(adapter_address[2]), Integer(adapter_address[3]),
      Integer(adapter_address[4]), Integer(adapter_address[5])]);
 end;

//Получение MAC-адреса по имени компа
function GetMacAddresses(Machine: string): String;
 const
    NCBNAMSZ = 16;        // absolute length of a net name
    MAX_LANA = 254;       // lana"s in range 0 to MAX_LANA inclusive
    NRC_GOODRET = $00;       // good return
    NCBASTAT = $33;       // NCB ADAPTER STATUS
    NCBRESET = $32;       // NCB RESET
    NCBENUM = $37;       // NCB ENUMERATE LANA NUMBERS
 type
   PNCB = ^TNCB;
   TNCBPostProc = procedure(P: PNCB); stdcall;
   TNCB = record
     ncb_command: Byte;
     ncb_retcode: Byte;
     ncb_lsn: Byte;
     ncb_num: Byte;
     ncb_buffer: PChar;
     ncb_length: Word;
     ncb_callname: array [0..NCBNAMSZ - 1] of char;
     ncb_name: array [0..NCBNAMSZ - 1] of char;
     ncb_rto: Byte;
     ncb_sto: Byte;
     ncb_post: TNCBPostProc;
     ncb_lana_num: Byte;
     ncb_cmd_cplt: Byte;
     ncb_reserve: array [0..9] of char;
     ncb_event: THandle;
   end;
   PLanaEnum = ^TLanaEnum;
   TLanaEnum = record
     Length: Byte;
     lana: array [0..MAX_LANA] of Byte;
   end;
   ASTAT = record
     adapt: TAdapterStatus;
     namebuf: array [0..29] of TNameBuffer;
   end;
 var
   NCB: TNCB;
   Enum: TLanaEnum;
   Adapter: ASTAT;
   MachineName: string;
 begin
   Result := "";
   MachineName := UpperCase(Machine);
   FillChar(NCB, SizeOf(NCB), #0);
   NCB.ncb_command := NCBENUM;
   NCB.ncb_buffer  := Pointer(@Enum);
   NCB.ncb_length  := SizeOf(Enum);
   if Word(NetBios(@NCB)) = NRC_GOODRET then
      begin
        FillChar(NCB, SizeOf(TNCB), #0);
        NCB.ncb_command  := NCBRESET;
        NCB.ncb_lana_num := Enum.lana[0];
        if Word(NetBios(@NCB)) = NRC_GOODRET then
           begin
             FillChar(NCB, SizeOf(TNCB), #0);
             NCB.ncb_command  := NCBASTAT;
             NCB.ncb_lana_num := Enum.lana[0];
             StrLCopy(NCB.ncb_callname, PChar(MachineName), NCBNAMSZ);
             StrPCopy(@NCB.ncb_callname[Length(MachineName)],
             StringOfChar(" ", NCBNAMSZ - Length(MachineName)));
             NCB.ncb_buffer := PChar(@Adapter);
             NCB.ncb_length := SizeOf(Adapter);
             if Word(NetBios(@NCB)) = NRC_GOODRET then Result:=AdapterToString(Adapter.adapt);
           end;
      end;
 end;


 
Piter ©   (2004-08-30 15:39) [6]

Verg ©   (30.08.04 1:23) [3]
Другими словами, сколько пройдет времени с момента (по тому коду)


можно пингануть. Если пинг вернется - значит MAC адрес уже точно в кеше



Страницы: 1 вся ветка

Текущий архив: 2004.11.07;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
14-1097818508
GavrilaMama
2004-10-15 09:35
2004.11.07
Прикол в WinRaR и как повесить MS Word


9-1088865597
Xilitoll
2004-07-03 18:39
2004.11.07
Переключение режима экрана в D3D


3-1096895604
Alex_V
2004-10-04 17:13
2004.11.07
Как избавиться от изменения размеров


14-1098349334
AlexG
2004-10-21 13:02
2004.11.07
Мне нужен метод остановить работу компа на N сек


14-1097843810
snake1977
2004-10-15 16:36
2004.11.07
настройка Delphi