• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Найти рабочий хост

  • Автор темы Shouldercannon
  • Дата начала
S

Shouldercannon

Есть список IP-адресов. Нужно пробежаться по этому списку, найти рабочий хост и остановить цикл после передав рабочий IP-адрес для дальнейших манипуляций.
Сделал набросок и не работает, постоянно возвращается False даже при одном рабочем хосте.
Код:
procedure TGetHost_Thread.Execute;
var
  CL: TClientSocket;
  I, TimeOut: Integer;
begin
  try
    try
      CL := TClientSocket.Create(nil);
      CL.ClientType := ctNonBlocking;

      for I := 0 to Form1.Memo1.Lines.Count - 1 do
      begin
        B := False;

        CL.Host := Form1.Memo1.Lines.Strings[I];
        CL.Port := 5191;
        CL.Open;
        // Имитация блокирующего режима
        for TimeOut := 1 to 20 do // 20 по 100 ms = 2 секунды
        begin
          if (CL.Active <> True) then
          begin
            Sleep(100);
          end;
        end;

        if CL.Active then
        begin
          B := True;
          Break;
        end;

        CL.Close;
      end;
    except
    end;
  finally
    FreeAndNil(CL);
  end;

  Synchronize(SyncProc);

  Terminate;
end;

procedure TGetHost_Thread.SyncProc;
begin
  if B then ShowMessage('Есть рабочий хост');
end;
 
M

-master-

Вы никак не хотите понять простую вешь.

Формы сами по себе, потоки сами по себе, никаких упоминаний форм контролов и т.п. елементов внутри методов потока не должно фигурировать в принципе. Как только написали в методе Execute доп. потока Form1 или Memo или ... так сразу неправильно.
Просто и тупо - написали - неправильно, без вариантов.
 
  • Нравится
Реакции: Shouldercannon
S

Shouldercannon

Вы никак не хотите понять простую вешь.

Формы сами по себе, потоки сами по себе, никаких упоминаний форм контролов и т.п. елементов внутри методов потока не должно фигурировать в принципе. Как только написали в методе Execute доп. потока Form1 или Memo или ... так сразу неправильно.
Просто и тупо - написали - неправильно, без вариантов.
В теле потока даже нельзя напрямую обращаться к переменным (Integer, String и т.д.) формы? Их тоже надо в помещать в обёртку
Код:
unit frm_Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;

type
  TFormMain = class(TForm)
    ...
  private
    { Private declarations }
    ...
  public
    { Public declarations }
    NotResponding: string;
  end;

type
  TMy_Thread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
    property NotResponding: string read FNotResponding;
  end;

  My_Thread := TFavorite_Thread.Create(True);
  My_Thread.FNotResponding := NotResponding;
  My_Thread.FreeOnTerminate := True;
  My_Thread.Resume;
 

Triton

Grey Team
01.10.2016
178
98
BIT
0
В классе потока надо создать поле, откуда будут браться адреса. И при создании класса потока, но обязательно до запуска потока, заполните это поле.
 
S

Shouldercannon

В классе потока надо создать поле, откуда будут браться адреса. И при создании класса потока, но обязательно до запуска потока, заполните это поле.
Исходя из этого, выше изложенный код с NotResponding: string; то что нужно
 
M

-master-

В теле потока даже нельзя напрямую обращаться к переменным (Integer, String и т.д.) формы?
Доп поток вообще не должен знать ни о каких формах, ни прямо и косвенно. Общение гуи с доп потоком должно быть по средствам спец. механизмов. Например сообщеия. Поток что то сделал кинул сообщение, и плевать есть там кому его ловить или нет.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!