2013-06-05 24 views

Trả lời

11

Bạn có thể sử dụng GetExtendedTcpTable chức năng đi qua các giá trị TCP_TABLE_OWNER_PID_ALL TableClass, điều này sẽ trả về một cấu trúc MIB_TCPTABLE_OWNER_PID mà là một mảng vào hồ sơ MIB_TCPROW_OWNER_PID, cấu trúc này chứa số cổng (dwLocalPort) và PID (dwOwningPid) của quá trình, bạn có thể giải quyết tên của PID bằng chức năng CreateToolhelp32Snapshot.

mẫu

{$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; 

    PMibTcpRowOwnerPid = ^TMibTcpRowOwnerPid; 
    TMibTcpRowOwnerPid = packed record 
    dwState  : DWORD; 
    dwLocalAddr : DWORD; 
    dwLocalPort : DWORD; 
    dwRemoteAddr: DWORD; 
    dwRemotePort: DWORD; 
    dwOwningPid : DWORD; 
    end; 

    PMIB_TCPTABLE_OWNER_PID = ^MIB_TCPTABLE_OWNER_PID; 
    MIB_TCPTABLE_OWNER_PID = packed record 
    dwNumEntries: DWORD; 
    table: Array [0..ANY_SIZE - 1] of TMibTcpRowOwnerPid; 
    end; 

var 
    GetExtendedTcpTable:function (pTcpTable: Pointer; dwSize: PDWORD; bOrder: BOOL; lAf: ULONG; TableClass: TCP_TABLE_CLASS; Reserved: ULONG): DWord; stdcall; 


function GetPIDName(hSnapShot: THandle; PID: DWORD): string; 
var 
    ProcInfo: TProcessEntry32; 
begin 
    ProcInfo.dwSize := SizeOf(ProcInfo); 
    if not Process32First(hSnapShot, ProcInfo) then 
    Result := 'Unknow' 
    else 
    repeat 
    if ProcInfo.th32ProcessID = PID then 
     Result := ProcInfo.szExeFile; 
    until not Process32Next(hSnapShot, ProcInfo); 
end; 

procedure ShowTCPPortsUsed(const AppName : string); 
var 
    Error  : DWORD; 
    TableSize : DWORD; 
    i   : integer; 
    pTcpTable : PMIB_TCPTABLE_OWNER_PID; 
    SnapShot : THandle; 
    LAppName : string; 
    LPorts  : TStrings; 
begin 
    LPorts:=TStringList.Create; 
    try 
    TableSize := 0; 
    //Get the size o the tcp table 
    Error := GetExtendedTcpTable(nil, @TableSize, False, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0); 
    if Error <> ERROR_INSUFFICIENT_BUFFER then exit; 

    GetMem(pTcpTable, TableSize); 
    try 
    SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    try 
     //get the tcp table data 
     if GetExtendedTcpTable(pTcpTable, @TableSize, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) = NO_ERROR then 
      for i := 0 to pTcpTable.dwNumEntries - 1 do 
      begin 
      LAppName:=GetPIDName(SnapShot, pTcpTable.Table[i].dwOwningPid); 
      if SameText(LAppName, AppName) and (LPorts.IndexOf(IntToStr(pTcpTable.Table[i].dwLocalPort))=-1) then 
       LPorts.Add(IntToStr(pTcpTable.Table[i].dwLocalPort)); 
      end; 
    finally 
     CloseHandle(SnapShot); 
    end; 
    finally 
     FreeMem(pTcpTable); 
    end; 

    Writeln(LPorts.Text); 

    finally 
    LPorts.Free; 
    end; 

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. 
+0

Có một đoạn hoặc ví dụ? Không bao giờ làm việc với điều đó – Hidden

+0

Ok, mã mẫu được thêm vào. – RRUZ

+0

Ok, cảm ơn tôi sẽ sớm kiểm tra. – Hidden

0

Để có được số cảng chính xác bạn phải sử dụng ntohs()

if SameText(LAppName, AppName) and 
    (LPorts.IndexOf(IntToStr(pTcpTable.Table[i].dwLocalPort))=-1) then 
    LPorts.Add(IntToStr(ntohs(pTcpTable.Table[i].dwLocalPort))); 

biết thêm here

Các vấn đề liên quan