Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Вниз

Отправка RARP-пакета (Send RARP).   Найти похожие ветки 

 
alexm_hs ©   (2007-02-14 19:48) [0]

Здравствуйте, уважаемые Мастера!

Есть вопрос: как получить IP-адрес хоста, зная его MAC-адрес?
Известно, что это делается отправкой RARP-пакета. В Инете есть несколько сорцов LINUXовых утилит на С++. Ломает портировать. Может кто уже делал?
Благодарю.


 
Rouse_ ©   (2007-02-14 23:41) [1]

По кэшируемой ARP таблице пробегать пробовал?
Если на поможет, тогда только "отправкой RARP-пакета"


 
alexm_hs ©   (2007-02-15 22:46) [2]

Да вот только записей в таблице не так много обычно бывает. Или может перед чтением АРП-таблицы пинг какой-нить широковещательный послать?
Кстати, вопрос еще в том, а есть ли в сетке сервер с RARP... А то можно сколько угодно послылать, никто не ответит :(


 
alexm_hs ©   (2007-02-16 19:19) [3]

Так ниче и неполучилось - экспериментальный код выкладываю. Мож кто повозиться захочет. А я решил пропинговать побыстрому в несколько потоков диапазон ИП-адресов, из из ARP-кеша взять уже что нужно.

uses ... IdRawFunctions,IdRawHeaders, IdStack;
................

function GetIPByMACAddr(macvalue: string): string;
const
 ETH_P_RARP = $8035; { Reverse Addr Res packet }
 MAX_PACKET_SIZE = $10000; // 2^16

var Init: TWSAData;
 SockOpt: BOOL;
 Sock: TSocket;
 Target: TSockAddrIn;
 Data : array [0..27] of Char;
 DataBytes : DWORD;
 PacketSize : integer;
 Packet: array[0..MAX_PACKET_SIZE - 1] of Byte;
 Addr_in: sockaddr_in;
 addr : TIdEtherAddr;
 addrip : TIdInAddr;
 a : integer;

begin
 WSAStartup($101, Init);  //socket init
 sock := socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
 SetSockOpt(Sock, SOL_SOCKET, SO_BROADCAST, PChar(@SockOpt), SizeOf(SockOpt));
 SockOpt := TRUE;

 Target.sin_port := htons(161);   ////////////??? фиг знает, какой сюда порт надо...
 Target.sin_addr.S_addr := INADDR_BROADCAST;
 Target.sin_family := AF_INET;

 Addr.ether_addr_octet[0] := $00; //заполняем массив в структуре октетами своего MAC-адреса. По идее тоже самое надо делать и
 Addr.ether_addr_octet[1] := $0E; //для искомого, но я в примере хотел хотя бы свой IP получить
 Addr.ether_addr_octet[2] := $A6;
 Addr.ether_addr_octet[3] := $51;
 Addr.ether_addr_octet[4] := $FA;
 Addr.ether_addr_octet[5] := $4B;
 Addrip.S_addr := inet_addr(PChar("0.0.0.0")); //по описанию протокола надо IP пустым делать.

 FillChar(Data, SizeOf(DAta), #0);
 IdRawBuildArpEx(1, ETH_P_RARP, 1, sizeof(ETH_P_RARP), 3, Addr,Addrip,Addr,Addrip,a,sizeof(a),Data);
 //IdRawBuildArpEx -- хитрая функция, переделанная из IdRawBuildArp из IdRawFunctions.pas (Indy).
 //Смысл ее в формировании ARP (RARP) пакета

 DataBytes := sizeof(Data);
 SendTo(Sock, Data, DataBytes, 0, Target, SizeOf(Target)); //собсно посылка...
 sleep(1000); //подождемс... мож кто ответит...
 PacketSize := recv(Sock, Packet, MAX_PACKET_SIZE, 0); ///... никто не ответил... По идее вместо Packet надо бы в Data
 //писать, но для эксперимента для начала пойдет хотябы просто набор данных увидеть.
 //-----------
 //если что и вернется, отсюда можно macvalue и заполнить...
 //-----------
 WSACleanup;
end;

function IdRawBuildArpEx(AHwAddressFormat, AProtocolFormat: word; AHwAddressLen, AProtocolLen: byte;
 AnOpType: word; ASenderHw: TIdEtherAddr; ASenderPr: TIdInAddr; ATargetHw: TIdEtherAddr; ATargetPr: TIdInAddr;
 const APayload; APayloadSize: integer; var ABuffer): boolean;
var
 HdrArp: TIdArpHdr;
begin
 // init result
 Result := FALSE;

 // check input
if (@ABuffer = nil) then
   Exit;
 // construct header
 HdrArp.arp_hrd := HToNS(AHwAddressFormat);
 HdrArp.arp_pro := HToNS(AProtocolFormat);
 HdrArp.arp_hln := AHwAddressLen;
 HdrArp.arp_pln := AProtocolLen;
 HdrArp.arp_op  := HToNS(AnOpType);
 Move(ASenderHw, HdrArp.arp_sha, AHwAddressLen);
 Move(ASenderPr, HdrArp.arp_spa, AProtocolLen);
 Move(ATargetHw, HdrArp.arp_tha, AHwAddressLen);
 Move(ATargetPr, HdrArp.arp_tpa, AProtocolLen);

 // copy payload
 if ((@APayload <> nil) and (APayloadSize > 0)) then
   Move(APayload, pointer(integer(@ABuffer) + Id_ARP_HSIZE)^, APayloadSize);

 // copy header
 Move(HdrArp, ABuffer, sizeof(HdrArp));

 Result := TRUE;
end;



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

Форум: "Сети";
Текущий архив: 2007.10.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.038 c
1-1185947117
YCH.Del
2007-08-01 09:45
2007.10.14
Контролы в ячейках TAdvStringGrid


15-1189705869
sdubaruhnul
2007-09-13 21:51
2007.10.14
А ни у кого нету?


15-1190128267
VirEx
2007-09-18 19:11
2007.10.14
Российская demoкратия (с)


2-1190096815
Kolan
2007-09-18 10:26
2007.10.14
Почему присвоение ListView.ItemIndex не отображается?


11-1173789560
Dmitriy___
2007-03-13 15:39
2007.10.14
Копирование Юникода в буфер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский