Здравствуйте, в этой статье я хотел бы поговорить о том как можно найти компьютеры в сети, это является довольно распространенной проблемой. В первой части нашей статьи мы будем использовать стандартный компонент, а в следующей части мы будем использовать компонент из библиотеки 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
Похожие записи
Метки: ICS, Indy, Ping, TIdIcmpClient
не работает шсходник
работает
Показывает только 127.0.0.1
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.
Почем она не работает?
как сделать пинг диапазона ip адресов
procedure TForm1.btn1Click(Sender: TObject);
begin
idcmpclnt1.LocalHost:=’176.194.204.175′; до 176.194.204.179
А как обработать пинг от хоста, которого не существует в сети.
Я пробовала пинговать диапазон адресов. Если пинга до хоста нет, то выдается ошибка «socket error 10040 message too long».
Подскажите как полученный IP преобразовать в имя? Желательно с помощью indy компонентов.
В имя компьютера?