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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2016, 23:17   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Найти рабочий хост

Есть список IP-адресов. Нужно пробежаться по этому списку, найти рабочий хост и остановить цикл после передав рабочий IP-адрес для дальнейших манипуляций.
Сделал набросок и сам же в нём запутался. Напрягает момент с имитацией блокирующего режима и постоянно B = False даже при подключении к рабочему хосту.
Код:
type
  TGetHost_Thread = class(TThread)
  private
    { Private declarations }
    B: Boolean;
  protected
    procedure Execute; override;
    procedure SyncProc;
  public
  end;

var
  Form7: TForm7;
  GetHost_Thread: TGetHost_Thread;

implementation

{$R *.dfm}
//!// Если ни один не ответил, то что передать в конце работы???
procedure TForm7.Button1Click(Sender: TObject);
begin
  GetHost_Thread := TGetHost_Thread.Create(True);
  GetHost_Thread.FreeOnTerminate := True;
  GetHost_Thread.Start;
end;

procedure TGetHost_Thread.Execute;
var
  CL: TClientSocket;
  I, TimeOut: Integer;
begin
  try
    try
      CL := TClientSocket.Create(nil);
      CL.ClientType := ctNonBlocking;
      CL.Port := 5191;

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

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

        if CL.Active then
        begin
          B := True;
          Break;
        end
        else CL.Close;
      end;
    except
    end;
  finally
    FreeAndNil(CL);
  end;

  Synchronize(SyncProc);

  Terminate;
end;

procedure TGetHost_Thread.SyncProc;
begin
  if B then ShowMessage('Есть рабочий хост');  
end;
Shouldercannon вне форума Ответить с цитированием
Старый 10.10.2016, 07:00   #2
Igor[Игорь]
Пользователь
 
Аватар для Igor[Игорь]
 
Регистрация: 25.11.2011
Сообщений: 52
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Ping, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    RichEdit1: TRichEdit;
    Button1: TButton;
    Ping1: TPing;
    procedure Button1Click(Sender: TObject);
    procedure Ping1DnsLookupDone(Sender: TObject; Error: Word);
    procedure Ping1EchoReply(Sender, Icmp: TObject; Error: Integer);
    procedure Ping1EchoRequest(Sender, Icmp: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 RichEdit1.Lines.Add('Поиск'+Edit1.Text+'');
 Ping1.Size:=StrToInt(Edit2.Text);
 Ping1.DnsLookup(Edit1.Text);
end;

procedure TForm1.Ping1DnsLookupDone(Sender: TObject; Error: Word);
begin
 if Error<>0 then
 begin
 RichEdit1.Lines.Add('Хост не найден'+Edit1.Text+'');
 Exit;
 end;
 RichEdit1.Lines.Add('Хост'+Edit1.Text+'='+Ping1.DnsResult);
 Ping1.Address:=Ping1.DnsResult;
 Ping1.Ping;
end;

procedure TForm1.Ping1EchoReply(Sender, Icmp: TObject; Error: Integer);
begin
if Error=0 then
RichEdit1.Lines.add('Не могу выполнить операцию ping:'+
Ping1.ErrorString)
else
RichEdit1.Lines.Add('Получено'+IntToStr(Ping1.Reply.DataSize)+
'байт от'+Ping1.HostIP+'за'+IntToStr(Ping1.Reply.RTT)+
'миллисекунд');
end;

procedure TForm1.Ping1EchoRequest(Sender, Icmp: TObject);
begin
 RichEdit1.Lines.add('Посылка'+IntToStr(Ping1.Size)+
 'байтов на'+Ping1.HostName);
 
end;

end.
e-mail: igor23dec@yandex.ru , ICQ: 2168364 , Telegram: @IgorVN
Delphi, PHP
Примеры http://igorvn.ucoz.ru/
Igor[Игорь] вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хост и кодировка cargo29 PHP 9 23.08.2011 22:15
Хост онлайн? XeN0N PHP 2 27.05.2009 20:38
Проблема найти путь к винде при запуске программы через удаленный рабочий стол grenles Общие вопросы Delphi 4 12.04.2009 23:29
ZIP + хост JoanM Свободное общение 1 09.02.2008 16:28