Здравствуйте, в этой статье я хотел бы поговорить о том как можно найти компьютеры в сети, это является довольно распространенной проблемой. В первой части нашей статьи мы будем использовать стандартный компонент, а в следующей части мы будем использовать компонент из библиотеки ICS. Да конечно первая часть мне больше нравится, так как компоненты стандартные, ничего нового искать не требуется и устанавливать, а вот ICS в каком-то роде библиотека мощная, так что для ознакомительных целей мы также ею воспользуемся, но нам придется ее дополнительно установить. Что касается стандартного компонента, то он входит в состав Indy, также довольно мощная библиотека. Вообще, как можно найти компьютеры в сети?  Наверное самый простой и довольно распространенный способ — это проверить диапазон ip-адресов сети на существование, диапазон может задать, например, пользователь, а можно сделать: определить ip-адрес свой, затем мы будем знать начало ip-адресов и с самого первого до 255 пройтись и отправить запросы на них. Конечно ip-адреса не обязательно могут совпадать, но это довольно часто бывает, что, например 20 компьютеров в сети и у них одинаковое начало ip-адресов (номер сети). Затем нам просто на каждый адрес необходимо отправить запрос и проверить, что он нам вернет, если что-то вернет, то значит ip-адрес существует и добавляем его в список наш, а точнее мы будем пинговать ip-адреса. Данная функция есть в Windows, Вы спокойно можете пропинговать любой ip-адрес, либо домен.

Как видите алгоритм поиска очень просто, но данный метод довольно медленный, конечно все зависит от размера вашей локальной вычислительной сети. Ну а теперь поговорим о самом компоненте, с которым мы будем работать. Данный компонент, как говорилось раньше входит в состав библиотеки Indy и находиться во вкладке — Indy Clients, а называется он — TIdIcmpClient. Данный компонент как раз предоставляет нам такую возможность как пинговать конкретный хост. К нашей задачи нам это определенно подходит. Что нам необходимо, чтобы пинговать какой-то хост, соответственно имя хоста, затем размер пакета, который мы будем отправлять на хост, а также при необходимо порт и TimeOut.

Все это мы будем перечислять при отправке. Так как сети у меня нету и полностью просканировать и протестировать у себя не смогу, поэтому я буду задавать свой конкретный хост, можно локальный (localhost), можно свой ip-адрес. Для того, чтобы просканировать всю сеть, вам необходимо циклом пройтись по заданному диапазону ip-адресов и добавить, которые пингуются, мы рассмотрим на конкретном ip-адресе, на локальном. В итоге на форме у меня следующие компоненты

  • TButton
  • TListBox

В TListBox мы будем выводить найденные ip-адреса, сети (в нашем случае должен появиться один ip-адрес, так как нету у меня сети). На событие OnClick кнопки я написал следующий код

procedure TForm1.Button1Click(Sender: TObject);
begin
   IdIcmpClient1.Host:='127.0.0.1';
   IdIcmpClient1.ReceiveTimeout:=1000;
   IdIcmpClient1.Ping('32');
   Caption:=IntToStr(IdIcmpClient1.ReplyStatus.MsRoundTripTime);
end;

Итак, что мы делаем, задаем имя хоста, затем TimeOut, через сколько прекращать отправку пакета, далее с помощью метода Ping мы отправляем пакет, при необходимо указываем размера пакет (не обязательный параметр), а в Caption (заголовок) нашего окна выводим время в миллисекундах за сколько наш пакет размером 32 байта был отправлен на хост. Далее выделяем наш компонент TIdIcmpClient. Далее переходим в список событий данного компонента и выбираем событие OnReply. После чего на данное событие пишем следующий код:

procedure TForm1.IdIcmpClient1Reply(ASender: TComponent;
  const AReplyStatus: TReplyStatus);
begin
   try
    if IdIcmpClient1.Host=AReplyStatus.FromIpAddress then
     ListBox1.Items.Add (AReplyStatus.FromIpAddress);
   except
    on e:Exception do
     //-//-//-//-//-//-//
   end;
end;

Что мы тут делаем, просто проверяем на существование наши хосты, если он существует, то добавляем в список, если нет, то ничего не делаем, обычно если не существует хост, то в AReplyStatus.FromIpAddress будет хост типа 0.0.0.0.

Для того, чтобы нам просканировать сеть, то мы на событие OnClick кнопки в цикле пингуем все наши хосты, а данное событие остается, которое каждый хост будет проверять на существование. Теперь мы знаем ip-адреса всей сети, только тех компьютеров, которые естественно включены в сеть. Ну а дальше мы рассмотрим как тоже самое сделать с помощью библиотеки ICS, а также как по ip-адресу узнать имя компьютера.

Ну а программы, которые производят поиск компьютеров в сети, достаточно много, тем более для Windows

Исходники статьи скачать можно тут


Автор статьи - Andrey53

Метки: , , ,




К записи “Поиск компьютеров в сети. Часть 1” оставлено комментариев: 8.

  1. Beso:

    не работает шсходник

  2. Beso:

    Показывает только 127.0.0.1

  3. Ден:

    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, IdBaseComponent, IdComponent, IdRawBase, IdRawClient,
    IdIcmpClient, StdCtrls;

    type
    TForm1 = class(TForm)
    btn1: TButton;
    lst1: TListBox;
    idcmpclnt1: TIdIcmpClient;
    procedure btn1Click(Sender: TObject);
    procedure idcmpclnt1Reply(ASender: TComponent;
    const AReplyStatus: TReplyStatus);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.btn1Click(Sender: TObject);
    begin
    idcmpclnt1.Host:=’176.194.204.175′;
    idcmpclnt1.ReceiveTimeout:=100;
    idcmpclnt1.Ping(’32’);
    Caption:=IntToStr(idcmpclnt1.ReplyStatus.MsRoundTripTime)
    end;

    procedure TForm1.idcmpclnt1Reply(ASender: TComponent;
    const AReplyStatus: TReplyStatus);
    begin
    try
    if idcmpclnt1.Host=AReplyStatus.FromIpAddress then lst1.Items.Add (AReplyStatus.FromIpAddress);
    except
    on e:Exception do
    end;

    end;
    end.

    Почем она не работает?

  4. Ден:

    как сделать пинг диапазона ip адресов

    procedure TForm1.btn1Click(Sender: TObject);
    begin
    idcmpclnt1.LocalHost:=’176.194.204.175′; до 176.194.204.179

  5. Liones:

    А как обработать пинг от хоста, которого не существует в сети.
    Я пробовала пинговать диапазон адресов. Если пинга до хоста нет, то выдается ошибка «socket error 10040 message too long».

  6. BenDjoys:

    Подскажите как полученный IP преобразовать в имя? Желательно с помощью indy компонентов.

Оставить комментарий на Beso

Вы можете использовать следующие теги:

*