Форум: "Сети";
Текущий архив: 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