![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
мак адрес по ip в сети [D6, D7, Win95/98, WinME, Win2k, WinXP]
Aplay © (2004-04-24 08:04:00)Подскажите как узнать мак адрес сетевой карты в делфе зная только IP по сети
Verg (2004-04-24 16:52:00) [21]
> Piter © (24.04.04 16:26) [17]
> Verg, а ты это кому? Я знаю это...
"Ф"сем, кто не знает.
Форум тут. Забыл?
Piter (2004-04-24 16:26:00) [22]Verg, а ты это кому? Я знаю это...
Verg (2004-04-24 15:22:00) [23]ARP - Address Resolution Protocol
Между физическими ethernet-адресами и логическими IP-адресами
никакого прямого соответсвия нет. Для того, чтобы отправитель
пакета мог узнать, по какому физическому адресу отпрявлять пакет,
существует протокол ARP (Address Resolution Protocol). ARP описан
в RFC826
ARP'овский пакет состоит из ethernet'овского заголовка, за которым
идут собственно ARP'овские данные.
typedef struct
{
ushort arp_hardware;
ushort arp_protocol;
uchar arp_alen_hard;
uchar arp_alen_ip;
ushort arp_opcode;
uchar arp_asrc_hard[6];
ulong arp_asrc_ip;
uchar arp_adst_hard[6];
ulong arp_adst_ip;
}
arp_packet;
arp_hardware - 1, обозначает, что мы живем на ethernet'е
arp_protocol - 0x800. Обозначает, что мы разговариваем по IP, а не по,
скажем, IPX'у.
arp_alen_hard - 6, длина аппаратного адреса.
arp_alen_ip - 4, длина логического (IP) адреса
arp_opcode - 1 - для ARP-запроса (ARP-request)
2 - для ARP-ответа (ARP-reply)
arp_asrc_hard - аппаратный адрес отправителя
arp_asrc_ip - IP-адрес отправителя. Может быть 0, если отправитель
не знает своего адреса (а только собирается узнать)
arp_adst_hard - аппаратный адрес получателя. В arp-запросе поле
не используется, поскольку адреса получателя мы
еще не знаем.
arp_adst_ip - IP-адрес получателя.
ARP работает следующим образом. Машина, желающая что-то отправить
по данному IP-адресу, формирует ARP-запрос, заполняя в нем все, кроме
аппаратного адреса получателя пакета. Этот пакет отправляется
ethernet'овским бродкастом всем машинам на сети. Та машина, которая
узнала в IP-адресе получателя себя, заполняет и отправляет назад,
но уже юникастом, ARP-ответ. При получении ARP-ответа надо проверить,
что IP-адрес отправителя - это то, что мы хотели, и взять из
ARP-пакета (но не ethernet'овского хидера!) искомый аппаратный адрес.
Поскольку ARP-запросы посылаются бродкастом, а в ARP-ответе не
ethernet'овский заголовок никто не смотрит, можно сделать ARP-сервер,
который посылает ARP-ответы за кого-то. Иногда эта возможность бывает
полезной.
Хотя этого нигде и не сказано, ARP-овские пакеты надо посылать
с интервалом где-нибудь в полсекунды раз шесть, пока не будет
получен ответ (впрочем, если не получив ответа все равно делать
ничего полезного нельзя, их можно посылать до бесконечности).
Кстати, получив ARP-запрос, есть смысл запомнить из него IP и
ethernet-адреса отправителя, скорее всего он скоро захочет с нами
разговаривать, и они нам пригодятся. Надо только проверить, что
эти IP-адрес правдоподобен.
Информацию, полученную по ARP'у следует где-нибудь кешировать, и
забывать через полминуты после последнего использования (или если
получен более новый ARP-пакет, отменяющий наши знания). Если этого
не делать, то после смены ethernet'овской карточки на какой-нибудь
машине в сети, мы можем навсегда потерять возможность с ней общаться.
Copyright (c) by Alexander Pevzner (pzz@pzz.msk.ru), 1998-1999
Piter (2004-04-24 15:19:00) [24]Verg (24.04.04 14:30) [13]
Как что даст?! Это даст то, что в ARP кэше появится MAC адрес целевого хоста
а, ну да. Я про то, что если в буфере есть такая запись - то заново пинговать не надо.
Так что лучше посмотреть - есть ли она, а уж потом попинговать, если нету.
Verg (24.04.04 14:30) [13]
Все это вообще справедливо (И ARP-кэш и SendARP) только, если мы находимся в одном физическом сегменте с тем самым IP-MAC-икс хостом
Я тоже так считаю. Только вот ESSNT при сканировании выдает MAC адрес удаленного компьютера... а происходит все в интернете, связь только по IP...
Rouse_ (2004-04-24 15:11:00) [25]> а что это даст? пинговаться будет, исходя из буфера...
Из какого?
> а зачем MAC адрес модему?
Ответ я тебе уже дал...
Verg (2004-04-24 14:30:00) [26]
> Piter © (24.04.04 13:01) [6]
> Verg (24.04.04 12:39) [5]
> GetIpNetTable вернет содержимое ARP кэша.
> Так что, перед этим надо хотя бы попинговать целевой IP
>
> а что это даст? пинговаться будет, исходя из буфера...
Как что даст?! Это даст то, что в ARP кэше появится MAC адрес целевого хоста.
Все это вообще справедливо (И ARP-кэш и SendARP) только, если мы находимся в одном физическом сегменте с тем самым IP-MAC-икс хостом.
Piter (2004-04-24 14:14:00) [27]а-а-а... я понял.
Я только не понял ответа на свой вопрос:
>а зачем MAC адрес модему?
Piter (2004-04-24 14:10:00) [28]а где тут IP интерфейс?
Rouse_ (2004-04-24 14:03:00) [29]> [9] Piter © (24.04.04 13:26)
Ну давай вспомним семиуровневую модель OSI
OSI Model Layer
-------------- -----------------------------------------------------
| | |
7 - Applica- | | User Applications |
tion | | |
-------------- -----------------------------------------------------
-------------- -----------------------------------------------------
| | Operating System |
6 - Presen- | | & |
tation | | Microsoft OS/2 LAN Manager |
-------------- -----------------------------------------------------
********** NetBIOS Interface **********************
-------------- --------------- ------------ ----------- ------------
| | | | | | | | |
5 - Session | | Microsoft | | XNS | | Other | | Ungermann |
| | NetBEUI | | Protocol | | Protocol| | Bass |
-------------- | Protocol | | Driver | | Driver | | PCNIU |
-------------- | Driver | | | | | | Driver |
| | | | | | | | |
4 - Trans- | | | | | | | | |
port | | | | | | | | |
-------------- | | | | | | | |
-------------- | | | | | | | |
| | | | | | | | |
3 - Network | | | | | | | | |
| | | | | | | | |
-------------- ------------- ------------ ----------- | |
********** NDIS Interface ********* | |
-------------- ------------- ------------ ----------- | |
| | IBM Token | |3Com Ethnt| | Other | | |
2 - Data | | Ring MAC | | MAC | | MAC | | |
Link | | Driver | | Driver | | Driver | | |
-------------- ------------- ------------ ----------- -------------
-------------- ------- ------- ------------ ----------- ------------
| | TR | | TR | | Ethernet | | Other | | UB PCNIU |
1 - Physical | |Adptr| |Adptr| | Adapter | | Adapter | | LAN |
| | #1 | | #2 | | | | | | Adapter |
-------------- ------- ------- ------------ ----------- ------------
Внимательней присмотрись к второму уровню...
Piter (2004-04-24 13:26:00) [30]uny (24.04.04 13:22) [8]
это не он?
не знаю
Rouse_ (24.04.04 13:15) [7]
Да ну?
Стало быть только для сетевых и точка?
а зачем MAC адрес модему?
uny (2004-04-24 13:22:00) [31]Piter, а ваша программа которая по интерфейсам считает трафик даже определила какой то мак номер, но он странный - так это не он?
Rouse_ (2004-04-24 13:15:00) [32]> Так что, перед этим надо хотя бы попинговать целевой IP.
Забыл это упомянуть...
> Да? Всю жизнь думал, что MAC адрес есть только у сетевых
> карт, для них и предназначен.
Да ну?
Стало быть только для сетевых и точка?
Ну-ну...
Piter (2004-04-24 13:01:00) [33]Rouse_ (24.04.04 12:28) [4]
но если мобильный подключен как модем - до конечно будет...
Да? Всю жизнь думал, что MAC адрес есть только у сетевых карт, для них и предназначен.
Verg (24.04.04 12:39) [5]
GetIpNetTable вернет содержимое ARP кэша.
Так что, перед этим надо хотя бы попинговать целевой IP
а что это даст? пинговаться будет, исходя из буфера...
Verg (2004-04-24 12:39:00) [34]
> Rouse_ © (24.04.04 10:28) [2]
GetIpNetTable вернет содержимое ARP кэша.
Так что, перед этим надо хотя бы попинговать целевой IP.
Rouse_ (2004-04-24 12:28:00) [35]По skylink не в курсе, но если мобильный подключен как модем - до конечно будет...
uny (2004-04-24 10:36:00) [36]а есть ли mac адрес у сотового? если skylink?
Rouse_ (2004-04-24 10:28:00) [37]Только есть один минус:
SendARP - применима только для NT
для Win 9x-Me придется воспользоваться GetIpNetTable
Пример возьми здесь:
http://www.delphimaster.ru/cgi-bin/download.pl?look=1&id=1078646471&n=1
Verg (2004-04-24 08:29:00) [38]function SendARP(DestIP:DWORD;SrcIP:DWORD; var pMacAddr; var PhyAddrLen:DWORD):DWORD;stdcall;external 'IPHLPAPI.DLL';