Лекция Программная реализация программы типа NetStat

Лекция «Программная реализация программы типа NetStat с параметром – а.

 

Теоретические данные.

NetStat - выполняет трассировку маршрута к указанному узлу. NETSTAT[-a][-e][-n][-s][-p имя][-r][интервал] Параметры:

Рис.1. Схема алгоритма программы.

2. Опишем структуры и функции, которые используются в программе:

2.1 Структуры, которые реализуют структуру протокола TCP:

// Описание соединения

PTMibTCPRow = ^TMibTCPRow;

TMibTCPRow = packed record

dwState: DWORD;

dwLocalAddr: DWORD;

dwLocalPort: DWORD;

dwRemoteAddr: DWORD;

dwRemotePort: DWORD;

end;

 

// Структура содержит количество и массив описанных соединений

PTMibTCPTable = ^TMibTCPTable;

TMibTCPTable = packed record

dwNumEntries: DWORD;

Table: array[0..0] of TMibTCPRow;

end;

 

2.2 Структуры, которые реализуют структуру протокола UDP:

 

PTMibUDPRow = ^TMibUDPRow;

TMibUDPRow = packed record

dwLocalAddr: DWORD;

dwLocalPort: DWORD;

end;

 

PTMibUDPTable = ^TMIBUDPTable;

TMIBUDPTable = packed record

dwNumEntries: DWORD;

UDPTable: array[0..0] of TMibUDPRow;

end;

 

Структуру протокола TCP заполняет функция GetTCPTable:

 

GetTCPTable(TcpTable, @TableSize,TRUE)

 

где TcpTable – сменная типа PTMibTCPTable,

TableSize – размер сменной.

 

Структуру протокола UDP заполняет функция GetUDPTable:

 

GetUDPTable(UdpTable, @TableSize,TRUE)

 

где UdpTable – сменная типа PTMibUDPTable,

TableSize – размер сменной.

Пооператорная схема алгоритма

 

1. Если Тср-протокол, загружаем функцию, которая реализует протокол – GetTCPTable;

 

GetTcpTable: function(Table: PTMibTCPTable; dwSize: PDWORD; bOrder: BOOL): DWORD; stdcall;

 

2. Проверка на ошибки:

 

if TCP.Checked = true then

 

Если есть ошибка, выйти из программы(exit), если нет:

2.1. Выделить память под Тср-таблицу;

GetMem(TcpTable, TableSize);

 

2.2. Заполнение таблицы протокола:

for i := 0 to TcpTable.dwNumEntries - 1 do

begin

if TcpTable.Table[i].dwRemoteAddr = 0 then

TcpTable.Table[i].dwRemotePort := 0;

 

StringGrid1.RowCount:=StringGrid1.RowCount+1;

StringGrid1.Cells[0,i+1]:='TCP';

StringGrid1.Cells[1,i+1]:=IPAddrToName(TcpTable.Table[i].dwLocalAddr,true)+':'+GetPort(TcpTable.Table[i].dwLocalPort,'TCP');

StringGrid1.Cells[2,i+1]:=IPAddrToName(TcpTable.Table[i].dwRemoteAddr,false)+':'+IntToStr(htons(TcpTable.Table[i].dwRemotePort));

StringGrid1.Cells[3,i+1]:=pchar(TCPConnState[TcpTable.Table[i].dwState]);

 

end;

 

2.2.1. Имя (ТСР);

2.2.2. Локальный адрес:

IPAddrToName(TcpTable.Table[и].dwLocalAddr,true)+':'+GetPort(TcpTable.Table[и].dwLocalPort,'TCP'). IPAddtToName – получает доменное имя по ІР. GetPort – получает имя протокола по открытому порту и протоколу ТСР(UDP);

2.2.3. Внешний адрес:

IPAddrToName(TcpTable.Table[и].dwRemoteAddr,false)+':'+IntToStr(htons(TcpTable.Table[и].dwRemotePort));

2.2.4. Состояние:

pchar(TCPConnState[TcpTable.Table[и].dwState]);

2.3. Освобождение памяти

FreeMem(TcpTable).

3. Если UDP-протокол, загружаем функцию, которая реализует протокол – GetUDPTable;

GetUdpTable: function(Table: PTMibUDPTable; dwSize: PDWORD; bOrder: BOOL): DWORD; stdcall;

 

3.1. Проверка на ошибки:

if UDP.Checked = true then

Если есть ошибка, выйти из программы(exit), если нет:

3.2. Выделить память под UDP-таблицу;

GetMem(UdpTable, TableSize);

3.3. Заполнение таблицы протокола:

for i := 0 to UdpTable.dwNumEntries - 1 do

begin

StringGrid1.RowCount:=StringGrid1.RowCount+1;

StringGrid1.Cells[0,i+1]:='UDP';

StringGrid1.Cells[1,i+1]:=IPAddrToName(UdpTable.UDPTable[i].dwLocalAddr,true) +':'+GetPort(UdpTable.UDPTable[i].dwLocalPort,'UDP');

StringGrid1.Cells[2,i+1]:='*.*';

StringGrid1.Cells[3,i+1]:='';

 

end;

3.3.1. Имя (UDP);

3.3.2. Локальный адрес:

IPAddrToName(TcpTable.Table[и].dwLocalAddr,true)+':'+GetPort(UdpTable.Table[и].dwLocalPort,'UDP'). IPAddtToName – получает доменное имя по ІР. GetPort – получает имя протокола по открытому порту и протоколу ТСР(UDP);

4.2.3.Внешний адрес – записываем “*”;

StringGrid1.Cells[2,i+1]:='*.*';

 

4.2.4 Состояние – “”;

StringGrid1.Cells[3,i+1]:='';

 

4.3. Освобождение памяти – FreeMem(UdpTable).

 

Текст программы

  interface  

Результат работы Netstat –a

Внимание!Результаты написанной программы и Netstat отличаются, потому что они были загружены на разных машинах.