При разработке программ на Delphi, иногда возникает необходимость узнать, какие порты использует определенный процесс. Это может быть полезно для отладки, мониторинга или для предотвращения конфликтов при работе нескольких приложений. В операционной системе Windows для этого существуют специальные инструменты.
Описание проблемы
Иногда разработчикам необходимо выяснить, через какие порты осуществляется связь определенного процесса. Это может быть связано с отладкой, необходимостью оптимизации работы приложения или с необходимостью избегать конфликтов при одновременной работе нескольких приложений, использующих одни и те же порты.
Решение проблемы
Для решения этой задачи можно использовать функцию GetExtendedTcpTable, которая возвращает структуру MIB_TCPTABLE_OWNER_PID. Эта структура содержит информацию о состоянии соединения, локальном и удаленном адресах и портах, а также идентификатор процесса (PID), владеющего соединением. Для получения имени процесса можно использовать функцию CreateToolhelp32Snapshot.
Пример кода на Object Pascal (Delphi)
{$APPTYPE CONSOLE}
uses
WinSock,
TlHelp32,
Classes,
Windows,
SysUtils;
const
ANY_SIZE = 1;
iphlpapi = 'iphlpapi.dll';
TCP_TABLE_OWNER_PID_ALL = 5;
type
TCP_TABLE_CLASS = Integer;
// Описание типов и функций опущено для краткости...
function GetPIDName(hSnapShot: THandle; PID: DWORD): string;
begin
// Реализация функции GetPIDName...
end;
procedure ShowTCPPortsUsed(const AppName : string);
var
Error, TableSize, i: DWORD;
pTcpTable: PMIB_TCPTABLE_OWNER_PID;
SnapShot: THandle;
LAppName, LPorts: TStrings;
begin
// Реализация функции ShowTCPPortsUsed...
end;
var
hModule: THandle;
begin
try
hModule := LoadLibrary(iphlpapi);
try
GetExtendedTcpTable := GetProcAddress(hModule, 'GetExtendedTcpTable');
ShowTCPPortsUsed('Skype.exe');
finally
FreeLibrary(hModule);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Readln;
end.
В коде выше приведен пример консольного приложения на Delphi, которое использует функцию GetExtendedTcpTable для получения списка используемых портов определенным процессом. Важно также учитывать, что функция ntohs используется для преобразования сетевого порядка байтов в порядок хоста, что необходимо для корректного получения номера порта.
Альтернативные подходы
Существуют и другие функции, такие как GetTcpTable2 и GetTcp6Table2, которые также могут быть использованы для получения информации о портах. Кроме того, не следует забывать, что UDP также использует порты, и для работы с UDP-соединениями существуют соответствующие функции.
Заключение
Разработчикам, работающим с Delphi и Pascal, важно знать о наличии инструментов Windows для мониторинга портов, используемых процессами. Это позволяет эффективно решать задачи, связанные с отладкой и оптимизацией работы приложений.
Инструкция для разработчиков, использующих Delphi, о методах раскрытия портов, используемых процессами в операционной системе Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS