【问题标题】:How to get Netstat info through the Use of API's in delphi 7如何通过在 delphi 7 中使用 API 获取 Netstat 信息
【发布时间】:2011-07-16 05:20:03
【问题描述】:

我的任务是查找信息 abt n/w 或 Windows 中的 netstat 命令给出的信息。现在,有人告诉我使用一些 API 来提取该信息。任何可用于此任务的 delphi 7 的 API 都会有所帮助。 我遇到过这个 API,IP helper API,但我在我的电脑上找不到它。我只能在 C:\Windows\System32 中找到 DLL 'iphlpapi.dll'。此外,关于如何使用这个特定 API 的信息似乎非常少。请帮忙。

提前致谢

附:早些时候,我通过执行 Netstat 命令来执行相同的操作,将输出写入文本文件,然后将其解析为显示,这对我来说是一种非常好的方法。然而,我的先生对此并不满意。是什么原因,我想不通。

【问题讨论】:

    标签: delphi


    【解决方案1】:

    检查这些窗口函数GetTcpTableGetUdpTableGetExtendedTcpTableGetExtendedUdpTable

    更新

    {$APPTYPE CONSOLE}
    
    uses
      WinSock,
      Windows,
      SysUtils;
    
    const
       ANY_SIZE = 1;
       iphlpapi = 'iphlpapi.dll';
       TCP_TABLE_OWNER_PID_ALL = 5;
    
       MIB_TCP_STATE:
       array[1..12] of string = ('CLOSED', 'LISTEN', 'SYN-SENT ','SYN-RECEIVED', 'ESTABLISHED', 'FIN-WAIT-1',
                                 'FIN-WAIT-2', 'CLOSE-WAIT', 'CLOSING','LAST-ACK', 'TIME-WAIT', 'delete TCB');
    
    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;
    
    procedure ShowCurrentTCPConnections;
    var
       Error      : DWORD;
       TableSize  : DWORD;
       i          : integer;
       IpAddress  : in_addr;
       RemoteIp   : string;
       LocalIp    : string;
       pTcpTable  : PMIB_TCPTABLE_OWNER_PID;
    begin
      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;
    
      //alocate the buffer
      GetMem(pTcpTable, TableSize);
      try
       Writeln(Format('%-16s %-6s %-16s %-6s %s',['Local IP','Port','Remote IP','Port','Status']));
       //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
             IpAddress.s_addr := pTcpTable.Table[i].dwRemoteAddr;
             RemoteIp         := string(inet_ntoa(IpAddress));
             IpAddress.s_addr := pTcpTable.Table[i].dwLocalAddr;
             LocalIp          := string(inet_ntoa(IpAddress));
             Writeln(Format('%-16s %-6d %-16s %-6d %s',[LocalIp,pTcpTable.Table[i].dwLocalPort,RemoteIp,pTcpTable.Table[i].dwRemotePort,MIB_TCP_STATE[pTcpTable.Table[i].dwState]]));
          end;
      finally
         FreeMem(pTcpTable);
      end;
    end;
    
    var
       hModule : THandle;
    begin
      try
        hModule             := LoadLibrary(iphlpapi);
        GetExtendedTcpTable := GetProcAddress(hModule, 'GetExtendedTcpTable');
        ShowCurrentTCPConnections;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
      Readln;
    end.
    

    【讨论】:

    • 我必须在使用部分包含一些东西吗?我在 Delphi 的自动完成中看不到它
    • 你必须声明你自己的函数头,查看这个链接的例子stackoverflow.com/questions/5351599/get-app-path-by-socket-port
    • 你能举一些例子来说明如何做到这一点吗?一些小代码会很有帮助
    • 我发现这段代码显示的端口号不正确。 MSDN 文档说这些值是按网络字节顺序排列的。端口 80 在表中的 DWORD 中显示为 00 50 00 00,需要交换 DWORD 的最低两个字节才能得到正确的答案。
    猜你喜欢
    • 2016-06-13
    • 1970-01-01
    • 2017-12-08
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2014-09-10
    • 1970-01-01
    相关资源
    最近更新 更多