Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2010, 17:34   #1
OPF_Nik
Пользователь
 
Регистрация: 09.11.2009
Сообщений: 33
Сообщение Сканер портов

Народ, решил написать многопоточный сканер портов, вот собственно код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Gauges, StdCtrls, unit2, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Gauge1: TGauge;
    IdTCPClient1: TIdTCPClient;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  arr: array[1..64] of scan;// масив потоков
  q: byte; //счетчик цикла
  s: integer; // начальный порт
  f: integer; // последний порт
  th: integer;// количество потоков
  glob: integer;// глобальная переменная

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  s:= 1; //начальный порт равен 1
  f:= 1024;// конечный порт равент 1024
  Glob:= s;// глобальная переменная равна начальному порту
  th:= 20;// количество потов
  Gauge1.MinValue:= s;
  Gauge1.MaxValue:= f;
  Application.ProcessMessages;
  for q:= 1 to th do
    Scan.Create(false and true);
    sleep(300);
  end;

end.
теперь код потока:
Код:
unit Unit2;

interface

uses
  Classes,SysUtils,IdTCPClient, windows;

type
  scan = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
    procedure add;
  end;

implementation
uses unit1;

var 
CriticalSection: TRTLCriticalSection;

procedure scan.add;
var
  IP:TIdTCPClient;
begin
  InitializeCriticalSection(CriticalSection);
  IP:= TIdTCPClient.Create(nil);
  IP.Host:= '127.0.0.1';
  try
   if glob <= f then
    IP.Port:= glob;

    IP.Connect();
      if ip.Connected = true then
      ip.Disconnect;
      form1.Memo1.Lines.Add('Порт открыт:' + IntToStr(glob));
  except
      form1.Memo1.Lines.Add('закрыт(( ' + IntToStr(glob));
    end;
      DeleteCriticalSection(CriticalSection);
      form1.Gauge1.Progress:= form1.Gauge1.Progress +1;
      Ip.Free;
      EnterCriticalSection(CriticalSection);
      glob:= glob +1;
      LeaveCriticalSection(CriticalSection);
end;

procedure scan.Execute;
begin
add;
end;
end.
Проблема в том, что все потоки, сканируют 1 порт, после чего останавливаются, как сделать так, что бы каждый поток сканировал свой порт, и что бы скан был до тех пор, пока все порты не будут по чеканы?

Последний раз редактировалось OPF_Nik; 02.02.2010 в 17:41.
OPF_Nik вне форума Ответить с цитированием
Старый 03.02.2010, 13:45   #2
OPF_Nik
Пользователь
 
Регистрация: 09.11.2009
Сообщений: 33
По умолчанию

Народ, помогайте)
OPF_Nik вне форума Ответить с цитированием
Старый 03.02.2010, 16:13   #3
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

glob:= glob +1;
Поставь перед IP.Connect();
подпись
liljon вне форума Ответить с цитированием
Старый 03.02.2010, 17:50   #4
OPF_Nik
Пользователь
 
Регистрация: 09.11.2009
Сообщений: 33
По умолчанию

один фиг((
OPF_Nik вне форума Ответить с цитированием
Старый 03.02.2010, 18:02   #5
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

я не до конца разглядел как ты хочешь сделать. вообщем алгоритм у тебя неверный. тебе надо разделить колличество сканируемых портов на колличество одновременных потоков.
для каждого потока выделить свой диапазон портов. тоесть надо просканировать от от 1 до 1024, это 1024 порта.
1024 / 20 (потоков) = 51.
для каждого потока переменные s, f и global(текущий порт) должны быть уникальными. Передавай их в поток перед созданием.
Для первого потока s=1;f = 51
Для второго s=52; f = 103;
и так далее. Идею то хоть понял?
подпись
liljon вне форума Ответить с цитированием
Старый 03.02.2010, 18:07   #6
OPF_Nik
Пользователь
 
Регистрация: 09.11.2009
Сообщений: 33
По умолчанию

да, хотел так сначала сделать, но не понял как логику реализовать
К тому же количество портов, и потоков, может быть другим
OPF_Nik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканер портов OPF_Nik Работа с сетью в Delphi 2 29.01.2010 19:26
сканер портов не работает Reds Помощь студентам 1 28.09.2008 21:14
Сканер портов One.Love Работа с сетью в Delphi 4 18.02.2008 16:05
Перенаправление портов ADSoft Безопасность, Шифрование 2 05.01.2008 00:30