2

我想在 Delphi 7 中通过 GetExtendedTcpTable 查看 TCP 和 UDP 协议的 IPV6 连接。我已经编写了代码来显示连接信息。问题是我的连接状态为 "0" 。据我阅读,有效状态为 1-12。下面是我的代码,谁能指出错误。

const
  ANY_SIZE    = 1;

type
  PTMib_TCP6Row = ^TMib_TCP6Row;
  TMib_TCP6Row = packed record
    dwState         : DWORD ;
    LocalAddr       : IN6_ADDR    ;
    dwLocalScopeId  : DWORD       ;
    dwLocalPort     : DWORD       ;
    RemoteAddr      : IN6_ADDR    ;
    dwRemoteScopeId : DWORD       ;
    dwRemotePort    : DWORD       ;
    dwProcessId     : DWORD       ;
  end;

  PTMIB_TCP6TABLE = ^TMIB_TCP6TABLE;
  TMIB_TCP6TABLE = packed record
    dwNumEntries : DWORD;
    Table: array[0..ANY_SIZE - 1] of TMib_TCP6Row;
  end;

function GetTCPEntries: Boolean;
var
  tcpTable1: PTMIB_TCP6TABLE;
  dwSize1, dwSize2, dwSize3, I: DWORD;             
begin
  Result := False;
  dwSize1 := 0;
  dwSize2 := 0;
  dwSize3 := 0;
  if GetExtendedTcpTable(nil, @dwSize1, False, AF_INET6, TCP_TABLE_OWNER_PID_ALL, 0) = ERROR_INSUFFICIENT_BUFFER then
  begin
    GetMem(tcpTable1, dwSize1);
    GetExtendedTcpTable(tcpTable1, @dwSize1, False, AF_INET6, TCP_TABLE_OWNER_PID_ALL, 0);
    dwSize2 := tcpTable1^.dwNumEntries;
    for i := 0 to dwSize2-1 do
    begin            
      //Form1.UpdateLog('State of connection = ' + IntTostr(tcpTable1.Table[i].dwState)  + #13#10);
    end;
    FreeMem(tcpTable1, dwSize1);
  end;
end;

dwState 在我的例子中是 0。

我已经看到了 sysinternals 程序“TCPView.exe”的输出,它将连接状态显示为“正在侦听”,所以我的机器没有任何问题。

帮助将不胜感激。提前致谢

4

1 回答 1

2

AF_INET6根据文档,您通过时返回的结构似乎TCP_TABLE_OWNER_PID_ALLMIB_TCP6ROW_OWNER_PID.

但是该结构看起来与您的TMib_TCP6Row. 这就是为什么您从TMib_TCP6Row记录中读出的值不是您所期望的。

阅读GetExtendedTcpTable. 在AF_INET6表中,它MIB_TCP6TABLE_OWNER_PID列为与关联的结构TCP_TABLE_OWNER_PID_ALL。并且MIB_TCP6TABLE_OWNER_PID有一个数组MIB_TCP6ROW_OWNER_PID

底线是您在界面一侧使用的记录与另一侧使用的结构不匹配。


其他一些评论:

  • 打包这些记录是不正确的。C++ 头文件不这样做,而是使用对齐的结构。对齐的结构是常态。在与 Windows API 交互时,结构将被对齐通常是一个安全的选择。
  • 您也忽略了GetExtendedTcpTable在您进行的第二次调用中检查的返回值。
于 2013-03-14T10:42:49.143 回答