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

Вниз

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

Наверх




Память: 0.5 MB
Время: 0.051 c
3-1102308410
tERRORist
2004-12-06 07:46
2005.01.02
Как вытащить Login и Password из уже установленного ADOConnection


14-1102684230
Чеширский_Кот
2004-12-10 16:10
2005.01.02
Куда подевался nikkie?


1-1103454793
IllusoryOrion
2004-12-19 14:13
2005.01.02
Hotkey и клавиша Win


3-1101984344
ksa2002
2004-12-02 13:45
2005.01.02
IBDataset


3-1102082356
korvin
2004-12-03 16:59
2005.01.02
Неправильный результат в процедуре