Форум: "Сети";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизThread, Ping... Найти похожие ветки
← →
ALex B. (2004-10-15 22:02) [0]Помогите советом!
Я уже давно анписал утилитку для локалки которая выполняет стандартные задачи: сканит, показивает шары, отсылает netsend-ы.... Но недавно мне в руки попалась аналогичная - Advanced IP Scanner. В ней в отличии от моей реализована многопоточность что даёт значительный прирост в скорости сканирования. Вот я и решил с вашей помошью осветить для себя эту тему Пингую я с использованием Indy IcmpClient но при помещении IcmpClient .ping() в поток выскакивает ошибка Подскажите пожалуйста как это лучше сделать. Я нашёл пару исходников но они очень упрощены, я же хочу чтоб была возможность из программы задавать максимальное количество потоков(пока например 64 выполняются остальные ждут), установки их приоритета. Я конечно понимаю что много хочу но буду благодарен за любую информацию!!!
Заранее спасибо!!!
← →
Verg © (2004-10-16 07:02) [1]я же хочу чтоб была возможность из программы задавать максимальное количество потоков
http://delphimaster.net/view/1-1097750096/
← →
ALex B. (2004-10-16 13:26) [2]Я уже пробовал ThreadPoll - через раз работает...
← →
Verg © (2004-10-16 14:39) [3]Ты не поверишь, но я знаю людей у которых и операция сложения работала "через раз", уж не говоря о "глюках" в ф-циях recv и winsock вообще. А так же танцоров, которым...
> Indy IcmpClient но при помещении IcmpClient .ping() в поток
> выскакивает ошибка
Так на что жалуемся? На Indy IcmpClient?
Твой отладчик отказывается работать? А редактор открывать исходники Indy?
Ну, а твой код, конечно, не содержит ни единой ошибки, просто комар носу не подточит...
> Я уже пробовал ThreadPoll - через раз работает...
Так найди причину, поправь, т.е доведи до РС (рабочего состояния), рассакжи в чем было дело.
А то как в продуктовом супермаркете, ей богу: То не нра, се не нра, а это почему не свежее....
> Подскажите пожалуйста как это лучше сделать
Пинговать?
Пинговать лучше так:
http://www.delphimaster.ru/articles/icmp.html
Дело в том, что не все пользователи программ имеют права администратора...
← →
ALex B. (2004-10-16 22:54) [4]idIcmpClient.Ping() уже работает - по неопытности не использовал synchronize. Метод приведённый в статье http://www.delphimaster.ru/articles/icmp.html испробовал - очень медленно(даже с минимальным Timeout) Опять мне всё не то:))) Это наверно из-за того что там используются функции из ICMP.DLL а в INDY всё ручками написано. Программа из ветки http://delphimaster.net/view/1-1097750096/ не пингует адреса а пытается получить имена всех указаных ip даже если их нет. Я щитаю рациональнее было бы это всё проделывать с живыми хостами - быстрее будет. Да, ещё там сколько IP попало в диапазон столько и потоков создаётся. А если количество IP ,eltn 10000? Но это всё мои мысли а я в этой области не настолько силён чтоб обсуждать других.
Я немного переделал вышеупомянутую программу но всёравно никакого прироста.
← →
ALex B. (2004-10-16 22:54) [5]procedure TScanThread.Execute;
begin
inherited;
Scan;
end;
function TScanThread.GetCompName(const Addr: Integer): String;
var
WSA: TWSAData;
Host: PHostEnt;
Err: Integer;
begin
Result := RES_UNKNOWN;
Err := WSAStartup(WSA_TYPE, WSA);
if Err <> 0 then begin
Exit;
end;
try
if Addr = INADDR_NONE then Exit;
Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET);
if Assigned(Host) then
Result := Host.h_name
else
finally
WSACleanup;
end;
end;
procedure TScanThread.Scan;
var
CompName: PWideChar; Result:string;
begin
CompName := StringToOleStr(GetCompName(FIP));
if CompName = RES_UNKNOWN then Exit;
FRes := TStringList.Create;
if CompName = "" then
begin
Result := IntToStr(FIRST_IPADDRESS(FIP))+
"." + IntToStr(SECOND_IPADDRESS(FIP)) +
"." + IntToStr(THIRD_IPADDRESS(FIP)) +
"." + IntToStr(FOURTH_IPADDRESS(FIP));
CompName := PWideChar(Result);
end
else begin
Fres.Add(CompName);
Synchronize(UpdateTree);
end; end;
procedure TScanThread.UpdateTree;
begin
Form1.tvResult.Items.BeginUpdate;
Form1.tvResult.Items.Add(nil, FRes.Strings[0]);
Form1.CompFound := Form1.CompFound + 1;
Form1.tvResult.Items.EndUpdate;
end;
procedure TForm1.SetThreadCount(const Value: Integer);
begin
if Value < FThreadCount then
FThreadCount := Value;
StatusBar1.Panels.Items[0].Text := Format(RES_THREADCOUNT, [Value]);
if Value = 0 then
begin
SpeedButton1.Enabled := True;
end;
Application.ProcessMessages;
end;
procedure scannet(a, b: byte);
var i:byte;
begin
for i := a to b do
try
begin
Form1.IdIcmpClient1.Host := InttoStr(x[1]) + "." + InttoStr(x[2]) + "." +InttoStr(x[3]) + "." + InttoStr(i);
Form1.IdIcmpClient1.Ping;
end;
except
begin
Form1.Speedbutton1.Enabled := true;
Form1.speedbutton2.Enabled := true;
MessageBox(0,"Error!","Warning!",MB_OK);
break;
end;
end;
end;
procedure startscan(stip,eip:string);
label noscan;
begin
ipos := pos(".",stip);
stip1 := strtoint(copy(stip,1,ipos-1));
delete(stip,1,ipos);
ipos := pos(".",stip);
stip2:= strtoint(copy(stip,1,ipos-1));
delete(stip,1,ipos);
ipos:=pos(".",stip);
stip3:= strtoint(copy(stip,1,ipos-1));
delete(stip,1,ipos);
ipos:=pos(".",stip);
stip4:= strtoint(copy(stip,1,ipos+3));
ipos:=pos(".",eip);
eip1 := strtoint(copy(eip,1,ipos-1));
delete(eip,1,ipos);
ipos:=pos(".",eip);
eip2:= strtoint(copy(eip,1,ipos-1));
delete(eip,1,ipos);
ipos:=pos(".",eip);
eip3:= strtoint(copy(eip,1,ipos-1));
delete(eip,1,ipos);
ipos:=pos(".",eip);
eip4:= strtoint(copy(eip,1,ipos+3));
x[1] := stip1;
x[2] := stip2;
x[3] := stip3;
x[4] := stip4;
y[1] := eip1;
y[2] := eip2;
y[3] := eip3;
y[4] := eip4;
k:=0;
if ((x[1] = y[1]) and (x[2] = y[2]) and (x[3] = y[3]))
then
begin
scannet(x[4], y[4]);
goto noscan;
end
else scannet(x[4], 255);
inc(x[3]);
t[2] := y[2];
t[3] := y[3];
t[4] := y[4];
y[2] := 255;
y[3] := 255;
y[4] := 255;
while (x[1] <= y[1]) do
begin
if (x[1] = y[1]) then y[2] := t[2];
while (x[2] <= y[2]) do
begin
if ((x[1] = y[1]) and (x[2] = t[2])) then y[3] := t[3] - 1;
while (x[3] <= y[3]) do
begin
scannet(0, 255);
if (x[3] = y[3]) then break else inc(x[3]);
end;
x[3] := 0;
if (x[2] = y[2]) then break else inc(x[2]);
end;
x[2] := 0;
if (x[1] = y[1]) then break else inc(x[1]);
end;
x[2] := t[2];
x[3] := t[3];
scannet(0,t[4]);
noscan:
end;
procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
const AReplyStatus: TReplyStatus);
begin
if (IdIcmpClient1.ReplyStatus.FromIpAddress <> "0.0.0.0") and (Form2.CheckBox1.Checked = true) then
begin
with TScanThread.Create(False) do
begin
IP := inet_addr(PChar(IdIcmpClient1.ReplyStatus.FromIpAddress));
FreeOnTerminate := True;
Resume;
end;
Application.ProcessMessages;
end ;
if (IdIcmpClient1.ReplyStatus.FromIpAddress <> "0.0.0.0") and (Form2.CheckBox1.Checked = false) then
begin
tvResult.Items.Add(nil,IdIcmpClient1.ReplyStatus.FromIpAddress);
APplication.ProcessMessages;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Form2.Show;
end;
end.
← →
ALex B. (2004-10-16 22:57) [6]Я конечно понимаю что от этого "КОДА" серца многих опытных програмистов обольются кровью, но всёже прошу учитывать мою недостаточную опытность:)
← →
Verg © (2004-10-17 09:37) [7]Я не понял какое отношение имеют доп. потоки (TScanThread) к IdIcmpClient.Ping()
> Пингую я с использованием Indy IcmpClient но при помещении
> IcmpClient .ping()
Я вижу, что твои потоки занимаются чем угодно, только не пингованием.
← →
Verg © (2004-10-17 09:44) [8]
> Метод приведённый в статье http://www.delphimaster.ru/articles/icmp.html
> испробовал - очень медленно(даже с минимальным Timeout
Все там нормально. Не медленне, чем через RAW сокеты, как сделано в Indy. Еще раз напоминаю: RAW сокеты могут работать только в приложениях, запущенных на правах Админа.
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.049 c