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

Вниз

Отправка 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.022 c
2-1190465938
Виктор007
2007-09-22 16:58
2007.10.14
Помогите перевести из C в Delphi


15-1190055923
AntiUser
2007-09-17 23:05
2007.10.14
Разработан принцип воспламенения океанов


9-1161459290
prodigy
2006-10-21 23:34
2007.10.14
DelphiX


1-1185946868
Alexey_k
2007-08-01 09:41
2007.10.14
www-addres to file name


15-1189762734
vladislavmsk
2007-09-14 13:38
2007.10.14
Специальный TGroupBox