Форум: "Сети";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c