В начало

 

X- PLANET

| НАЧАЛО |       | СТАТЬИ |      | DOWNLOAD |     | О ПРОЕКТЕ |

Пингер

Начало Начнем, пожалуй с того, что выясним, что такое пингер. Это программа, позволяющая определить существование IP-адреса и, например, время, необходимое для пинга, что позволяет оценить скорость. Итак, перед тем, как начать кодить надо установить новую библиотеку ICS (Internet Component Suite), которую вам надо скачать. Теперь разархивируйте ее в любой каталог, например, /Delphi 6/Components/Net. Теперь запустите Дельфи. Закройте автоматически созданный проект, он нам не нужен. Теперь надо открыть файл IcsdelXX.dpk (ХХ- номер установленной у вас дельфи. Если стоит 6я или 7я, то откройте Icsdel50.dpk). Когда вы откроете файл, перед вами появится окно, вверху которого надо нажать на кнопку "Install", чтобы дельфи скомпилировал и проинсталлировал библиотеку. Теперь у вас должно появиться окно:

Если окно не появилось, прочтите все сначала. Теперь нужно открыть в меню Tools пункт Environment options и перейти на закладку Library, нажмите на кнопку справа от поля ввода Library Path, и в появившемся окне

 

Теперь закройте все окна, нажимая к кнопку "ОК" и сохраняя все изменения. 

Создайте новый проект. На него поместите:

  • 3 ярлыка (Label, Standart) 
  • 3 поля ввода (Edit, Standart)
  • компонент RichEdit, System
  • одну галочку (CheckBox, Standart)
  • 2 BitBtn, Additional
  • 1 SpeedButton, Additional
  • ProgressBar, Win32

и расположите примерно так же, как я. Главное - чтобы строки ввода стояли так же.

Кроме этого, добавьте SaveDialog (Dialogs) и Ping (FPiette). Их можно располагать как угодно, при исполнении проги они все равно не будут видны. 

Кодить начнем с самого простого - сохранение. В обработчике пишем:

If SaveDialog1.Execute then
RichEdit1.Lines.SaveToFile(SaveDialog1.FileName+'.rtf');

Теперь Запрограммируем реакцию на нажатие SpeedButton1

RichEdit1.Lines.Clear;

 А вот теперь пойдет настоящий кодинг. Для начала прикинем, как должна работать наша программа. Главной ее задачей будет определение наличия IP-адреса и, как дополнение, время принятия ответного сигнала. Но проверять по одному адресу не интересно и достаточно долго. Мы автоматизируем процесс. Наша прога будет перебирать адреса от, например, 127.0.0.0 до 127.0.0.255, то есть варьировать последнее число. Итак, что для этого надо? Во первых, получить последнее число начального и конечного адреса, во-вторых - преребрать все адреса, которые находятся в этом промежутке и вывести результаты перебора в поле вывода RichEdit. Итак, пишем процедуру для кнопки "Ping":

procedure TMainForm.Button3Click(Sender: TObject);
var
SAdr, //символы до последней точки начального адреса

SEAdr,// символы до последней точки конечного адреса
Adr, //начальный адрес
Addr, //пингуемый адрес
EAdr:String;//конечный адрес
num, //число символов в начальном IP адресе
BegAdr,//последнее число в начальном IP
EndAdr,//последнее число в конечном IP
ScanAdr,//число сканируемых адресов
i,//счетчик цикла
ENum :Integer;//число символов в конечном IP адресе
begin
RichEdit1.Lines.Add('Ïîèñê'''+Edit1.Text+'''');//извещаем о том, что начался пинг
if CheckBox1.Checked then //проверяем, не стоит ли у нас галочка,
begin  //которая говорит о том, что проверяется не один адрес, а промежуток адресов.
begin
Adr:=Edit1.Text; //Получаем начальный адрес
num:=Length(Adr);//Узнаем длину начального адреса
EAdr:=Edit3.Text; //Получаем конечный адрес
Enum:=Length(EAdr);//Узнаем длину конечного адреса
if Adr[num-1]='.' then //Если второй символ с конца - точка
begin 
BegAdr:=StrToInt(Adr[num]);//то получаем последнее число
Delete(Adr,num,1);//удаляем последнее число из начального адреса, чтобы потом туда //подставлять другие числа, меняя IP
end
else if Adr[num-2]='.' then //аналогично если третий
begin
BegAdr:=StrToInt(Adr[num]+Adr[num-1]);
Delete(Adr,num-1,2);
end
else if Adr[num-3]='.' then //и если четвертый
begin
BegAdr:=StrToInt(Adr[num-2]+Adr[num-1]+Adr[num]);
Delete(Adr,num-2,3);
end;

{аналогичным образом получаем последнее число из конечного адреса}
if EAdr[Enum-1]='.' then 
EndAdr:=StrToInt(EAdr[Enum])
else if EAdr[Enum-2]='.' then 
EndAdr:=StrToInt(EAdr[Enum-1]+EAdr[Enum])
else if EAdr[Enum-3]='.' then 
EndAdr:=StrToInt(EAdr[Enum-2]+EAdr[Enum-1]+EAdr[Enum]);

ScanAdr:=EndAdr-BegAdr;//получаем количество проверяемых адресов
i:=BegAdr;//счетчику цикла присваиваем значение начального адреса
ProgressBar1.Max:=ScanAdr;//устанавливаем длину полоски прогресса
Ping1.Size:=StrToInt(Edit2.Text);(устанавливаем размер посылаемых пакетов
while i<EndAdr do //пока счетчик меньше конечного адреса
begin
Addr:=Adr+IntToStr(i);//получаем непосредственно проверяемый адрес. который мы //составляем из начального без последнего числа, вместо которого подставляем //счетчик цикла
Ping1.DnsLookup(Addr);//сообщаем компоненту пингуемый адрес
ProgressBar1.Position:=ProgressBar1.Position+1;//увеличиваем позицию полоски прогресса
inc(i);//увеличиваем счетчик на единицу
end;
end;
ProgressBar1.Position:=0;//после окончания обнуляем позицию полоски прогресса
end
else //если же у нас не отмечена галочка, то проверяем 1 адрес (или же проверяем //символьное имя сервака
Ping1.Size:=StrToInt(Edit2.Text);//сообщаем компоненту величину пакета
Ping1.DnsLookup(Edit1.Text);//проверяем адресок
Edit1.Text:=Ping1.DnsResult;//на случай, если было введено символьное имя, мы после //пинга автоматически подставляем IP вместо символов.
end;

Однако написание пингера этим не ограничивается. Надо написать еще несколько строчек. Выделите компонент Ping, перейдите в Object Inspector'e на закладку Events и на событие OnDnsLookupDone напишите:

if Error <> 0 then //если ошибка, то
begin
RichEdit1.Lines.Add('Хост не найден'''+ Edit1.Text+'''');
RichEdit1.Lines.Add('');
Exit;//выход из процедуры
end;
RichEdit1.Lines.Add('Хост''' + Edit1.Text + ''' - '+Ping1.DnsResult);//иначе выводим имя хоста и его IP
Ping1.Address:=Ping1.DnsResult;//Задаем адрес компоненту
Ping1.Ping;//Пинг

Теперь на событие OnEchoReply:

if Error=0 then //если ошибочка
RichEdit1.Lines.Add('Не могу выполнить операцию Ping: '+Ping1.ErrorString)
else
RichEdit1.Lines.Add('Адрес существует, время '+IntToStr(Ping1.Reply.RTT)+' милисекунд);

Вот теперь наш пингер окончен. Его можно протестировать, введя адрес 127.0.0.1 - это IPшка вашего компа (или что-то вроде этого). Для тестирования в "полевых" условиях надо подключиться к сети. 

Мой пингер в работе:

Исходник можно взять здесь

Copyright© - Константин, www.konstantin17.narod.ru/

Карта сайта
Tips & Tricks
DOWNLOAD
Статьи
Рассылка
Гостевая
Учеба
Ссылки
О проекте
Реклама
 
Hosted by uCoz