Delphi в компьютерных сетях
Целью этой статьи является ознакомление с возможностями работы приложений разработанных в среде Delphi с протоколами вычислительных сетей.
По сути — это небольшой сканер сети, позволяющий отследить в сети ли хост и получить его имя.
И так приступим:
Можно воспользоваться компонентами Indy. В моем случае это NM-компоненты (сути не меняет). В примере используется NMPing.
Раздел uses программы включает в себя winsock, StdCtrls, Psock, NMEcho, NMFngr, NMICMP;
Объявляем переменные:
var Form1: TForm1; hostname,status:string;
Для выполнения целевой задачи , в секции implementation опишем функцию, которую и будем вызывать.
Функция призвана получить имя хоста по IP-адресу. В ней же опишем и получаемые отклики.
Function GetNameFromIP(Const IP: string): string; Const ERR_INADDR = ‘ Адрес не существует.’; ERR_HOST = ‘ Имя не определено.’; RES_UNKNOWN = ‘ ошибка определения хоста’; ERR_WSA = ‘Can not initialize WSA.’; WSA_Type = $101; //$202; var WSA : TWSAData; Host : PHostEnt; Addr : Integer; Err : Integer; Begin Result := RES_UNKNOWN; Err := WSAStartup(WSA_Type, WSA); If Err <> 0 Then Begin Exit; End; Addr := inet_addr(PChar(IP)); If Addr = INADDR_NONE Then Begin Result := ERR_INADDR; WSACleanup; Exit; End; Host := gethostbyaddr(@Addr, SizeOf(Addr), PF_INET); If Assigned(Host) Then Result := Host.h_name Else Result := ERR_HOST; WSACleanup; End;
Далее описываем процедуры, обрабатывающие результат запроса функции :
// Функция вернула положительный результат
procedure TForm1.NMPing1Ping(Sender: TObject; Host: String; Size, Time: Integer); begin status:=’есть хост — ‘+GetNameFromIP(NMPing1.Host); NMPing1.Abort; end; // Функция вернула отрицательный результат по тайм-ауту procedure TForm1.NMPing1TimeOut(Sender: TObject); begin status:=’хост не отвечает — ‘+GetNameFromIP(NMPing1.Host); NMPing1.Abort; end; // Функция вернула отрицательный результат по хосту procedure TForm1.NMPing1InvalidHost(Sender: TObject); begin status:=’хост не отвечает или неверно задан хост — ‘+GetNameFromIP(NMPing1.Host); NMPing1.Abort; end;
Теперь навешем на кнопку процедуру опроса заданного диапазона IP-адресов.
Здесь начальный и конечный адреса заданы в самом коде — при необходимости их легко вынести во внешний объект, -например в компонент Edit.
Данный код позволяет обходить все возможные IP-адреса в заданном диапазоне, т.е. при заданных нами условиях, в перечень сканируемых попадут адреса из сетей диапазонов 10.109.88.0; 10.109.89.0; 10.109.90.0; ……. 10.110.0.0; ….. 10.110.1.0; . и так до конечного адреса 10.110.89.151.
Результат работы программы выводится в компонент Memo.
Конечно же системами безопасности это будет расценено как сканирование сети или попытка вторжения. Ниже код.
procedure TForm1.Button2Click(Sender: TObject); var ip1,ip2:string; // строковые переменные для хранения начального и конечного адресов сканируемого диапазона i,x,y,z,x2,y2,z2,a,b,j:integer; // y,z,x2,y2,z2 - части IP-адреса IPV4, разделенные в адресе точками StL,StL2 :TStringList; // временные объекты, - для парсинга адресов hostname:string; begin ip1:='10.109.88.100'; //начальный адрес сканируемого диапазона ip2:='10.110.89.151'; //конечный адрес сканируемого диапазона StL:=TstringList.Create; StL2:=TstringList.Create; StL.Delimiter:='.'; StL2.Delimiter:='.'; StL.DelimitedText:=ip1; StL2.DelimitedText:=ip2; a:= strtoint(StL[0]); b:= strtoint(StL2[0]) ; x:= strtoint(StL[1]); y:= strtoint(StL[2]) ; z:= strtoint(StL[3]) ; x2:= strtoint(StL2[1]) ; y2:= strtoint(StL2[2]) ; z2:= strtoint(StL2[3]) ; // ВЕСЬ КОД НИЖЕ - ВЫПОЛНЯЕТ ПРОХОД ПО ДИАПАЗOНУ АДРЕСОВ С ФОРМИРОВАНИЕМ ОТВЕТОВ if (a=b) and (x=x2) and (y=y2) then begin for i:=z to z2 do begin NMPing1.Host:=inttostr(a)+'.'+inttostr(x)+'.'+inttostr(y)+'.'+inttostr(i); NMPing1.Ping; memo1.Lines.Add(inttostr(a)+'.'+inttostr(x)+'.'+inttostr(y)+'.'+inttostr(i)+' -- '+status); end; end; if (a=b) and (x=x2) and (yy) then begin for i:=0 to 255 do begin NMPing1.Host:=inttostr(a)+'.'+inttostr(x)+'.'+inttostr(j)+'.'+inttostr(i); NMPing1.Ping; memo1.Lines.Add(inttostr(a)+'.'+inttostr(x)+'.'+inttostr(j)+'.'+inttostr(i)+' -- '+status); end; end; if j=y2 then begin for i:=0 to z2 do begin memo1.Lines.Add(inttostr(a)+'.'+inttostr(x)+'.'+inttostr(j)+'.'+inttostr(i)); end; end; end; end; StL.Free; StL2.Free; end;
Данная статья приведена в качестве учебного материала и не призывает выполнять сканирование сетей. Связанные с приведенным кодом противоправные действия — полностью под Вашу ответственность.
Урок 35. Работа с сетью
Изучим основы работы с сетью. На прошлом уроке мы сделали одну часть нашего сетевого приложения — сервер на основе компонента TServerSocket . Это занятие мы посвятим созданию второй части нашего приложения. Естественно, что это будет клиент и для него мы будем использовать компонент TClientSocket .
Создайте новый проект на Delphi . На форме разместите компонент TClientSocket с вкладки Internet палитры компонентов.
Изменим для него ряд свойств, а именно свойство Address установите в 127.0.0.1 , свойство Host — в localhost , Port — 3000. Вообще говоря эти параметры задают компьютер, к которому будет подсоединяться наш клиент. Задавать его можно либо по IP-адресу (мы тут написали 127.0.0.1 — это IP-адрес нашего компьютера), либо по имени ( localhost — это универсальное имя для нашего компьютера). Если у вас есть доступ к сети, то можете указать и что-нибудь другое (разумеется там должен быть запущен наш сервер). В качестве порта мы должны указать тоже значение, которое мы задали для сервера на прошлом уроке.
Добавьте еще на форму две кнопки. Для первой измените ее заголовок на » Подсоединиться » (по ней произойдет подсоединение к нашему серверу) и для второй — на » Отправить » (по ней мы будем отправлять некоторые данные на сервер). Добавьте на форму также одно текстовое поле — введенная в нем информация и будет отправляться на сервер. Свойство Text для текстового поля установите в «» ( пустую строку ).
В обработчике для первой кнопки (с заголовком «Подсоединиться») пишем:
procedure TForm1.Button1Click(Sender: TObject);
В этом коде мы просто делаем наш сокет активным. Так как у него установлены свойства Address, Host и Port , то произойдет соединение с соответствующим сервером.
В обработчике для второй кнопки пишем:
procedure TForm1.Button2Click(Sender: TObject);
В этом коде мы отсылаем данные из текстового поля Edit1.
Все! Можно приступать к испытаниям. Для этого сначала запустите написанный на прошлом уроке сервер и нажмите в нем на кнопку » Слушать «. После этого запустите клиента и нажмите в нем на кнопку » Подсоединиться «. Обратите внимание, что у сервера поменяется заголовок. Теперь в текстовом поле клиента введите некоторый текст и нажмите на кнопку » Отправить «. Этот текст передастся на сервер и покажется там в текстовом поле.
Всё на этом урок закончен.