Реферат Курсовая Конспект
Текст программы - раздел Информатика, Лекция Программная реализация программы типа NetStat Unit Unit1; Interface Uses...
|
unit Unit1;
interface
uses
WinTypes,Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Grids, ComCtrls, ExtCtrls,winsock;
type
// Описание соединения
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;
PTMibUDPRow = ^TMibUDPRow;
TMibUDPRow = packed record
dwLocalAddr: DWORD;
dwLocalPort: DWORD;
end;
PTMibUDPTable = ^TMIBUDPTable;
TMIBUDPTable = packed record
dwNumEntries: DWORD;
UDPTable: array[0..0] of TMibUDPRow;
end;
TForm1 = class(TForm)
BitBtn1: TBitBtn;
RadioGroup1: TRadioGroup;
StatusBar1: TStatusBar;
TCP: TRadioButton;
UDP: TRadioButton;
Label1: TLabel;
StringGrid1: TStringGrid;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
TCPConnState: // Connection state type
array[1..12] of string =
('Closed', 'Listening', 'Syn_Sent',
'Syn_Rcvd', 'Established', 'Fin_Wait1',
'Fin_Wait2', 'Close_Wait', 'Closing',
'Last_Ack', 'Time_Wait', 'Delete_Tcb'
);
implementation
{$R *.DFM}
// получает доменное имя по IP
function IPAddrToName(IPAddr : DWORD;Local:Bool): string;
var
SockAddrIn : TSockAddrIn;
HostEnt : PHostEnt;
WSAData : TWSAData;
Address : in_addr;
Name : array[0..255] of Char;
Length : DWord;
begin
if ((IPAddr = 0) or (IPAddr = 16777343)) and Local then //127.0.0.1
begin
Length:= sizeof(Name);
if GetComputerName(Name,Length) Then
result:=StrPas(Name);
Exit;
end;
Address.s_addr := IPAddr;
WSAStartup($101, WSAData);
SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(inet_ntoa(Address)));
HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, sizeof(SockAddrIn.sin_addr.S_addr), AF_INET);
if HostEnt <> nil then
begin
WSACleanup;
result := StrPas(Hostent^.h_name)
end
else
begin
WSACleanup;
result:=inet_ntoa(Address)
end;
end;
//получаем имя протокола по открытому порту и протоколу UDP или TCP
function GetPort(port: DWORD; proto:PChar): string;
var
wsdata : TWSAData;
ServEnt : PServEnt;
begin
WSAStartup ($101, wsdata);
ServEnt := GetServByPort(port,proto);
if ServEnt <> nil then
begin
WSACleanup;
Result := ServEnt^.s_name;
end
else
begin
WSACleanup;
Result := IntToStr(htons(port));
end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
GetTcpTable: function(Table: PTMibTCPTable; dwSize: PDWORD; bOrder: BOOL): DWORD; stdcall;
GetUdpTable: function(Table: PTMibUDPTable; dwSize: PDWORD; bOrder: BOOL): DWORD; stdcall;
TableSize,
Error : DWORD;
TCPTable : PTMibTCPTable;
UdpTable: PTMibUDPTable;
i: DWORD;
begin
StringGrid1.RowCount:=0;
StringGrid1.Cells[0,0]:='Имя';
StringGrid1.Cells[1,0]:='Локальный адрес';
StringGrid1.Cells[2,0]:='Внешний адрес';
StringGrid1.Cells[3,0]:='Состояние';
if TCP.Checked = true then
begin
GetTcpTable := GetProcAddress(LoadLibrary('iphlpapi.dll'), 'GetTcpTable');
TableSize := 0;
Error := GetTCPTable(nil, @TableSize , false);
if Error <> ERROR_INSUFFICIENT_BUFFER then Exit;
try
GetMem(TcpTable, TableSize);
if GetTCPTable(TcpTable, @TableSize,TRUE) = NO_ERROR then
begin
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;
end;
finally
FreeMem(TcpTable);
end;
end;
if UDP.Checked = true then
begin
GetUdpTable := GetProcAddress(LoadLibrary('iphlpapi.dll'), 'GetUdpTable');
TableSize := 0;
Error := GetUdpTable(nil, @TableSize , false);
if Error <> ERROR_INSUFFICIENT_BUFFER then Exit;
try
GetMem(UdpTable, TableSize);
if GetUdpTable(UdpTable, @TableSize, TRUE) = NO_ERROR then
begin
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;
end;
finally
FreeMem(UdpTable);
end;
end;
end;
end.
Результат работы сделанного индивидуального задания:
– Конец работы –
Эта тема принадлежит разделу:
Теоретические данные NetStat выполняет трассировку маршрута к указанному узлу... Рис Схема алгоритма программы...
Если Вам нужно дополнительный материал на эту тему, или Вы не нашли то, что искали, рекомендуем воспользоваться поиском по нашей базе работ: Текст программы
Если этот материал оказался полезным ля Вас, Вы можете сохранить его на свою страничку в социальных сетях:
Твитнуть |
Новости и инфо для студентов