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

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 сен 2016, 14:15

Есть список 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;
Аватара пользователя
AiK
Сообщения: 2274
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

30 сен 2016, 16:04

1. Сделай вывод отладочного сообщения ShowMessage('Есть рабочий хост'); в 29 строке.
2. А порт 5191 точно файерволлом не блокируется?
Даже самый дурацкий замысел можно воплотить мастерски
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

30 сен 2016, 18:58

Тест проводится на одном компе, тут и сервер и клиент. Ничто не блочится
Ответить