PDA

Просмотр полной версии : скан диапозона ip [delphi]


OPF_Nik
18.02.2010, 15:53
народ подскажите, есть диапозон, например 127.0.0.1-127.0.255.255, как идеи можете предложить, что бы просканить весь диапозон?

=Zeus=
18.02.2010, 17:09
В интернете есть куча исходников на эту тему. Есть идея воспользоваться гуглом и не морочить другим мозги.

slesh
19.02.2010, 10:22
Даже тут на форуме были примеры этого.
работает всё по принципу. типа так:

start_addr := inet_addr('127.0.0.1');
stop_addr := inet_addr('127.0.255.255');

while start_addr <> stop_addr do
begin
выполняешь свои действия
asm
mov eax, start_addr
bswap eax
inc eax
bswap eax
mov start_addr, eax
end;
end;


т.е. ты определишь начальный и конечный адрес. Затем просто увеличиваешь начальный на 1 и так пока он не станет равным конечному.
Но т.к. в IP порядок байт обратный тому который хранится в памяти, то для увеличения придется поменять порядок байт, что и делает инструкция bswap

flacs
19.02.2010, 13:09
function IpToInt(ip: string): dword; // превращаем IP в число
begin
result := inet_addr(PChar(ip));
result := (result shl 24) or (result and $FF00 shl 8) or
(result and $FF0000 shr 8) or (result shr 24);
end;

function IntToIP(i: DWORD): string; // число в IP
var kk: DWORD;
begin
kk:=(i shl 24) or (i and $FF00 shl 8) or
(i and $FF0000 shr 8) or (i shr 24);
Result:= inet_ntoa(in_addr(kk))
end;

procedure Scan;
begin
AddrTo:=IpToInt(IpTo); AddrFrom:=IpToInt(IpFrom);
for i:=AddrTo to AddrFrom do ping_addr(IntToIp(i));
end;

slesh
19.02.2010, 13:16
2 flacs вот какраз bswap и выполняет
kk:=(i shl 24) or (i and $FF00 shl 8) or (i and $FF0000 shr 8) or (i shr 24);
только выполняет это всё намного быстрее

или как вариант можно юзать апишку из winsock - ntohl она считай и реализует эти действия

sn0w
19.02.2010, 13:22
канал какой? лвс или че еще? для лвс делал арпсканер

rankor777
19.02.2010, 21:51
Ужас, зачем вам в делфи вставки на асме? Для ускорения чтоли? xD
Сканить порты лучше внешним сканером (VNC ByPass Auth например), потому как они лучше по-любому.