| ARP запрос на delphi |
| Author: sacredphoenix |
| 19.09.2009 17:20 |
|
Вообще-то я просто хотел проверить модуль для посветки кода, для этого и выкладываю прямо здесь и сейчас исходник замечательной утилиты arper (только windows). Несмотря на столь грозное название все что она делает - посылает ARP-запрос. В качестве параметра принимается IP-адрес.
program arper; {$APPTYPE CONSOLE} uses windows, winsock, sysutils; {------------------------------------------------------} // Вывод причин ошибки procedure print_err(const comment:string; err : DWORD); var locbuf : array[0..1023] of char; begin FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM OR FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, err, 0, locbuf, sizeof(locbuf), nil ); CharToOem(locbuf, locbuf); write(ErrOutput, comment, ' (', err, ') ', pChar(@locbuf)); end; {------------------------------------------------------} procedure usage(); begin writeln(ErrOutput, 'Usage: arper ip_address'); halt(1); end; {------------------------------------------------------} type SendARP_func = function( DestIP, SrcIP:in_addr; pMacAddr, PhyAddrLen:PULONG ): DWORD; stdcall; var iphlpdll : HMODULE; SendARP : SendARP_func; src_ip, dest_ip : in_addr; mac_addr : array [0..7] of byte; mac_addr_len : ULONG; i, ret_val : DWORD; BEGIN if ParamCount() <> 1 then usage(); //динамическая загрузка библиотеки iphlpdll := LoadLibrary('Iphlpapi.dll'); if iphlpdll = 0 then begin print_err('Error: LoadLibrary failed with', GetLastError()); halt(1); end; @SendARP := GetProcAddress(iphlpdll, 'SendARP'); if @SendARP = nil then begin print_err('Error: GetProcAddress failed with', GetLastError()); halt(1); end; //инициализация параметров и вызов SendARP src_ip.S_addr := 0; dest_ip.S_addr := inet_addr(pChar(ParamStr(1))); if dest_ip.S_addr = INADDR_NONE then begin writeln(ErrOutput, 'Bad ip address'); halt(1); end; mac_addr_len := 6; ret_val := SendARP(dest_ip, src_ip, @mac_addr, @mac_addr_len); if ret_val = NO_ERROR then begin if mac_addr_len <> 0 then begin //вывод результатов for i := 0 to mac_addr_len - 1 do begin write(inttohex(mac_addr[i],2)); if i <> mac_addr_len - 1 then write('-'); end; end else begin writeln( ErrOutput, 'Warning: SendARP completed successfully, but returned length = 0' ); end; end else print_err('Error: SendArp failed with', ret_val); END.
|
| Обновлено 27.02.2010 16:08 |