Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
1-1103283641
V l a d i m i r
2004-12-17 14:40
2005.01.02
Обработка клавиш YESNOCANCEL в MessageBox


6-1097249272
pirate
2004-10-08 19:27
2005.01.02
Узнать IP у удаленного компа(TCP/IP)


14-1102916116
080D:07BBh
2004-12-13 08:35
2005.01.02
Ненужная работа


14-1103011442
Gero
2004-12-14 11:04
2005.01.02
Аудио кассеты


14-1102260533
Урфин Джюс
2004-12-05 18:28
2005.01.02
Подводим итоги года: 2004





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский