Delphi中获取进程连接端口的实现方法

Delphi编程环境中,获取进程连接端口是一项重要的任务,特别是在系统监控、网络调试或安全分析中非常关键。将介绍如何在 Delphi 中通过调用 Windows API 函数实现这一功能,并提供具体代码示例。

1. 进程与端口概念

  • 进程是程序执行的一个实例,具有唯一的进程 ID(PID)。
  • 端口用于区分不同的网络服务,范围为 0 到 65535,0-1023 为系统保留端口。

2. 关键 Windows API 函数

在 Delphi 中获取连接端口时,需要以下 API 支持:

* CreateToolhelp32Snapshot:创建进程快照,可遍历系统中的所有进程。

* Process32First/Process32Next:遍历进程快照,获取进程 ID 等详细信息。

* GetModuleFileNameEx:获取指定进程的主模块文件名,通常是 .exe 文件。

* WSAStringToAddress:将 IP 字符串转换为 sockaddr 结构体,便于后续套接字操作。

* GetTcpTable2:获取 TCP 连接表,包含进程端口信息。

3. 代码示例

以下 Delphi 代码演示了如何获取指定进程的连接端口:

uses ..., Windows, Winsock2, Msinet, SysUtils;

function GetProcessPorts(const ProcName: string): TStringList;
var
    SnapHandle: THandle;
    ProcessEntry32: TProcessEntry32;
    ModuleFileName: array[0..MAX_PATH] of Char;
    TcpTable: PMibTcpTable2;
    Size: DWORD;
    IPAddrStr: array[0..15] of Char;
    SocketAddr: TInetSocketAddr;
    Index: Integer;
begin
    Result := TStringList.Create;
    SnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if SnapHandle <> INVALID_HANDLE_VALUE then
        try
            ProcessEntry32.dwSize := SizeOf(ProcessEntry32);
            if Process32First(SnapHandle, ProcessEntry32) then
            begin
                repeat
                    if CompareText(ProcessEntry32.szExeFile, ProcName) = 0 then
                    begin
                        GetModuleFileNameEx(SnapHandle, ProcessEntry32.th32ProcessID, ModuleFileName, MAX_PATH);
                        Size := 0;
                        GetTcpTable2(nil, Size, True);
                        SetLength(TcpTable, Size div SizeOf(TMibTcpRow2));
                        if GetTcpTable2(Pointer(TcpTable), Size, True) = NO_ERROR then
                        try
                            for Index := 0 to TcpTable.dwNumEntries - 1 do
                            begin
                                if TcpTable.Table[Index].dwLocalProcessId = ProcessEntry32.th32ProcessID then
                                begin
                                    WSAStringToAddress(PAnsiChar(IntToHex(TcpTable.Table[Index].dwLocalPort, 4)), AF_INET, nil, SocketAddr, Size);
                                    Result.AddFmt('%s - %d', [ModuleFileName, SocketAddr.sin_port]);
                                end;
                            end;
                        finally
                            VirtualFree(Pointer(TcpTable), 0, MEM_RELEASE);
                        end;
                    end;
                until not Process32Next(SnapHandle, ProcessEntry32);
            end;
        finally
            CloseHandle(SnapHandle);
        end;
end;

4. 注意事项

请确保在项目中链接kernel32advapi32iphlpapiws2_32mswsock库。此外,此代码仅适用于 TCP 连接,若需获取 UDP 或其他类型的连接信息,需使用其他 API 函数。

通过 Delphi 对 Windows API 的深入理解和运用,可以高效地获取进程端口信息,从而进行更全面的系统网络监控。

zip
200822522542727065.zip 预估大小:1个文件
file
Project1.exe 451KB
zip 文件大小:235.39KB