{$mode objfpc}{$H+}
Uses Windows, jwawinsock2, jwaiprtrmib, jwaiphlpapi;
// Функция преобразует состояние порта в строковый эквивалент
function PortStateToStr(const State: DWORD): String;
begin
case State of
MIB_TCP_STATE_CLOSED: Result := 'CLOSED';
MIB_TCP_STATE_LISTEN: Result := 'LISTEN';
MIB_TCP_STATE_SYN_SENT: Result := 'SYN SENT';
MIB_TCP_STATE_SYN_RCVD: Result := 'SYN RECEIVED';
MIB_TCP_STATE_ESTAB: Result := 'ESTABLISHED';
MIB_TCP_STATE_FIN_WAIT1: Result := 'FIN WAIT 1';
MIB_TCP_STATE_FIN_WAIT2: Result := 'FIN WAIT 2';
MIB_TCP_STATE_CLOSE_WAIT: Result := 'CLOSE WAIT';
MIB_TCP_STATE_CLOSING: Result := 'CLOSING';
MIB_TCP_STATE_LAST_ACK: Result := 'LAST ACK';
MIB_TCP_STATE_TIME_WAIT: Result := 'TIME WAIT';
MIB_TCP_STATE_DELETE_TCB: Result := 'DELETE TCB';
else
Result := 'UNKNOWN';
end;
end;
// Получение TCP/UDP статистики при помощи стандартных методов
procedure Show;
var
Size: DWORD;
TCPTable: PMIB_TCPTABLE;
UDPTable: PMIB_UDPTABLE;
I, Count: DWORD;
begin
// для успешного получения стстаистики первоначально необходимо определиться
// сколько памяти потребует данная операция
// для этого делаем так:
// Вделяем память под TCP таблицу (под один элемент)
GetMem(TCPTable, SizeOf(TMibTCPTable));
try
// Показываем что памяти у нас не выделено
Size := 0;
// Выполняем функцию и после этого переменная Size
// будет содержать кол-во необходимой памяти
if GetTcpTable(TCPTable, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
finally
// освобождаем память занятую под один элемент
FreeMem(TCPTable);
end;
// Теперь выделяем уже требуемое кол-во памяти
GetMem(TCPTable, Size);
Count:=0;
try
// Выполняем функцию
if GetTcpTable(TCPTable, Size, True) = NO_ERROR then
begin
WriteLn('');
WriteLn('Standart TCP Stats');
WriteLn('Host':15, 'RemotePort':10, 'State':15, 'LocalPort':10);
WriteLn('==================================================');
// и насинаем выводить данные по ТСР
for I := 0 to TCPTable^.dwNumEntries - 1 do
If (inet_ntoa(in_addr(TCPTable^.Table[I].dwRemoteAddr))<>'127.0.0.1') and
(inet_ntoa(in_addr(TCPTable^.Table[I].dwRemoteAddr))<>'0.0.0.0') Then
Begin
WriteLn(inet_ntoa(in_addr(TCPTable^.Table[I].dwRemoteAddr)):15,
htons(TCPTable^.Table[I].dwRemotePort):10,
PortStateToStr(TCPTable^.Table[I].dwState):15,
htons(TCPTable^.Table[I].dwLocalPort):10);
Inc(Count);
End;
end;
WriteLn('==================================================');
WriteLn('OutConnections: ', Count);
finally
// Не забываем освободить память
FreeMem(TCPTable);
end;
// По аналогии поступаем и с UDP статистикой
GetMem(UDPTable, SizeOf(TMibUDPTable));
try
Size := 0;
if GetUdpTable(UDPTable, Size, True) <> ERROR_INSUFFICIENT_BUFFER then Exit;
finally
FreeMem(UDPTable);
end;
GetMem(UDPTable, Size);
try
if GetUdpTable(UDPTable, Size, True) = NO_ERROR then
begin
WriteLn('');
WriteLn('Standart UDP Stats');
WriteLn('Host':15, 'Port':7);
WriteLn('======================================');
Count:=0;
for I := 0 to UDPTable^.dwNumEntries - 1 do
if (inet_ntoa(in_addr(TCPTable^.Table[I].dwLocalAddr))<>'127.0.0.1') and
(inet_ntoa(in_addr(TCPTable^.Table[I].dwLocalAddr))<>'0.0.0.0') Then
Begin
WriteLn(inet_ntoa(in_addr(UDPTable^.Table[I].dwLocalAddr)):15,
htons(UDPTable^.Table[I].dwLocalPort):7);
Inc(Count);
End;
end;
WriteLn('==================================================');
WriteLn('OutConnections: ', Count);
finally
FreeMem(UDPTable);
end;
end;
Begin
Show;
End.
Если Вы уже зарегистрированы на Портале - войдите в систему, если Вы еще не регистрировались - пройдите простую процедуру регистрации.