Читайте также:
|
|
ФИЛИАЛ
ФЕДЕРАЛЬНОГО ГОСУДАРСТВЕННОГО БЮДЖЕТНОГО
ОБРАЗОВАТЕЛЬНОГО УЧРЕЖДЕНИЯ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНДУСТРИАЛЬНЫЙ УНИВЕРСИТЕТ»
В г. РОСЛАВЛЕ СМОЛЕНСКОЙ ОБЛАСТИ
(ФИЛИАЛ ФГБОУ ВПО «МГИУ» в г. РОСЛАВЛЕ)
ОТЧЕТ
ЗАДАНИЕ НА ЗАНЯТИЕ № 3/26
СКАНИРОВАНИЕ ресурсов ИС
Тема: « корпоративные информационные системы »
Выполнил
Студент 42 группы
Слабодчиков А.А
Рославль 2013
Дисциплина «Корпоративные информационные системы»
ЗАДАНИЕ НА ЗАНЯТИЕ № 3/26
СКАНИРОВАНИЕ ресурсов ИС
В работе реализуется метод открытого сканирования сети «TCP SYN». Этот метод состоит в последовательной передаче на объект сканирования SYN-запроса для создания соединений на различных портах (вызов функции connect).
Возможны следующие реализации метода открытого сканирования «TCP SYN»:
· последовательный вызов функции connect c различными номерами портов. Недостатком этого метода является медленная работа приложения, так как новое соединение создается только после того, как создано предыдущее соединение;
· использование асинхронных сетевых функций. При вызове функции connect в асинхронном режиме ОС посылает запрос на установление соединения с сервером и, не дожидаясь реального соединения, продолжает работать дальше. Недостаток этого метода – надо самому проверять результат работы функции. Это несколько усложняет программный код;
· создание многопоточного сканера. В этом случае для сканирования очередного порта создается новый поток.
В работе реализован последний из рассмотренных методов.
1. Создание многопоточного приложения для сканирования сети
При создании многопоточного приложения для сканирования сети выполните следующие пункты.
1) Создайте проект (New Application) (рис. 1).
2) В разделе uses подключите библиотеку: Winsock.
3) В разделе VAR добавьте глобальную переменную i – номер очередного проверяемого порта
var
Form1: TForm1;
i: Integer; {номер очередного порта}
implementation.
unit Code;
interface
uses
Windows, Messages, SysUtils, Classes, Controls, Forms,
StdCtrls, ExtCtrls, WinSock, AppEvnts, Buttons, Gauges, Spin;
type
TForm1 = class(TForm)
Panel1: TPanel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
SpeedButton1: TSpeedButton;
ListBox1: TListBox;
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
Label3: TLabel;
Label4: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
procedure SpeedButton1Click(Sender: TObject);
end;
TMyThread = class(TThread)
protected
procedure Execute; override;
end;
TFSocket = record
sa: TSockAddr;
FData: integer;
TimeOut: integer;
end;
const
MAX_PORTS=500;
Ping=5000;
var
Form1: TForm1;
FSocket: array [0..MAX_PORTS - 1] of TFSocket;
FPort: WORD;
FInfo: TWSADATA;
FHost: integer;
FPStart, FPEnd: WORD;
SThread: TMyThread;
implementation
{$R *.dfm}
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
begin
if (Msg.message>=FPStart+WM_USER) //идентификатор посылает на порт сообщения к юзеру
and (Msg.message<=FPEnd+WM_USER) //идентификатор посылает на порт сообщения от юзера
then
if WSAGETSELECTERROR(Msg.lParam)=0 //для связи с соккетом
then
case WSAGETSELECTEVENT(msg.lParam) of
FD_CONNECT: //соединение сокетного события
begin
ListBox1.Items.Add(IntToStr(ListBox1.Count+1)+
') IP: '+inet_ntoa(FSocket[0].sa.sin_addr)+' | '+
'Port: '+intToStr(Msg.message - WM_USER));
Application.ProcessMessages;
end;
end;
Handled:=false;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
if WSAStartup(MAKEWORD(2, 0), FInfo)<>0 //короч для инициализации соккетов
then Halt;
for i:=0 to MAX_PORTS-1 do
with FSocket[i] do
begin
TimeOut:= 0;
FData:= Socket(AF_INET, SOCK_STREAM, 0); //задаеться ипи адрес
if FData = SOCKET_ERROR
then
begin
WSACleanup;
Halt;
end;
end;
Application.OnMessage:=Form1.ApplicationEvents1Message;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
i: integer;
begin
if SThread<>nil
then
begin
SThread.Terminate;
SThread.WaitFor;
SThread:=nil;
end;
for i:=0 to MAX_PORTS-1 do
CloseSocket(FSocket[i].FData);
WSACleanup;
end;
procedure InitSockets;
var
i: integer;
begin
for i:=0 to MAX_PORTS-1 do
with FSocket[i] do
if (FPort>=FPEnd) or (SThread.Terminated)
then break
else
if GetTickCount-TimeOut>PING
then
begin //связываеться соккет, готовность соединения для чтения и записи
sa.sin_family:=AF_INET;
sa.sin_addr.S_addr:=FHost;
sa.sin_port:=htons(FPort);
WSAAsyncSelect(FData, Application.Handle, WM_USER+FPort, FD_CONNECT);
connect(FData, FSocket[i].sa, SizeOf(FSocket[i].sa));
TimeOut:=GetTickCount;
inc(FPort);
Form1.Label2.Caption:='Port: '+intToStr(FPort);
Application.ProcessMessages;
Sleep(PING div MAX_PORTS);
end;
end;
procedure TMyThread.Execute; //Многопоточная обработка отправка пакетов на порты
var
i: integer;
buf: in_addr;
begin
FPStart:=Form1.SpinEdit1.Value;
FPEnd:=Form1.SpinEdit2.Value;
FHost:=inet_addr(PChar(Form1.Edit1.Text));
if (FPEnd<=FPStart)or (Form1.SpinEdit1.Value>40000) or
(Form1.SpinEdit2.Value>40000)
then FHost:=SOCKET_ERROR;
if FHost=SOCKET_ERROR
then
begin
if not Terminated
then SThread:=nil;
Form1.SpeedButton1.Caption:='Запуск';
Exit;
end;
buf.S_addr:=FHost;
Form1.Edit1.Text:=inet_ntoa(buf);
Form1.ListBox1.Clear;
FPort:=FPStart;
for i:=0 to MAX_PORTS-1 do
with FSocket[i] do
begin
TimeOut:=0;
FData:=Socket(AF_INET, SOCK_STREAM, 0);
end;
while not Terminated do
begin
InitSockets;
if FPort>=FPEnd
then break;
end;
for i:=0 to MAX_PORTS-1 do
CloseSocket(FSocket[i].FData);
if not Terminated
then
begin
SThread:=nil;
Form1.SpeedButton1.Caption:='Запуск';
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if SThread=nil
then
begin
SThread:=TMyThread.Create(false);
SpeedButton1.Caption:='Стоп';
end
else
begin
SThread.Terminate;
SThread.WaitFor;
SThread:=nil;
SpeedButton1.Caption:='Запуск';
end;
end;
end.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Можно ли с помощью разработанной программы сканировать UDP-порты?
Да можно, программой предусмотрена отправка пакетных данных.
2. Какое максимальное количество портов можно сканировать с помощью разработанной программы?
32000 из за ограничений оператора integer
3. Объясните принцип работы многопоточных программ.
Многопоточность (как доктрину программирования) не следует путать ни с многозадачностью, ни с многопроцессорностью, несмотря на то, что операционные системы, реализующие многозадачность, как правило реализуют и многопоточность.
К достоинствам многопоточности в программировании можно отнести следующее:
Упрощение программы в некоторых случаях за счет использования общего адресного пространства.
Меньшие относительно процесса временны́е затраты на создание потока.
Повышение производительности процесса за счет распараллеливания процессорных вычислений и операций ввода/вывода.
Существуют всего две цели, которые преследуют программисты, используя потоки:
позволить приложению параллельно работать над несколькими относительно независимыми задачами;
использовать преимущества многопроцессорных систем для повышения производительности приложения.
Как не парадоксально это может показаться на первый взгляд, но две эти задачи ортогональны друг другу и даже могут вступать в противоречие. Поэтому, еще на этапе проектирования вы должны определиться с приоритетами этих задач, так как это и определит всю структуру приложения.
4. Как определить адреса компьютеров сети?
1. В командной строке набрать ipconfig /all и смотреть IP адрес. Пакажет все сетевые подключения
2. Встать на сетевые подключения нажать правую кнопку мыши, открыть свойства. Выбрать нужное сетевое подключене, аналогично зайти в свойства. Выбрать Протокол TCP/IP нажать кнопку свойства.
Дата добавления: 2015-09-01; просмотров: 45 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Прочитайте тексты 1, 2, 3. | | | Классификация |