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" の出力を見たところ、接続状態が "Listening" と表示されているので、マシンに問題はありません。

助けていただければ幸いです。前もって感謝します

4

1 に答える 1

2

AF_INET6ドキュメントに従うと、渡したときに返される構造体TCP_TABLE_OWNER_PID_ALLMIB_TCP6ROW_OWNER_PID.

しかし、その構造体は、あなたの宣言のようには見えませんTMib_TCP6Row。そのため、レコードから読み取った値TMib_TCP6Rowが期待したものとは異なります。

のドキュメントを読んでくださいGetExtendedTcpTableAF_INET6表では、 に関連付けられた構造体としてリストさMIB_TCP6TABLE_OWNER_PIDれていますTCP_TABLE_OWNER_PID_ALL。の配列MIB_TCP6TABLE_OWNER_PIDがありMIB_TCP6ROW_OWNER_PIDます。

肝心なのは、インターフェイスの側で使用しているレコードが、反対側で使用されている構造体と一致しないということです。


その他のコメント:

  • これらのレコードをパックするのは正しくありません。C++ ヘッダー ファイルはこれを行わず、整列された構造体を使用します。アラインされた構造体が標準です。Windows API と対話する場合、構造体が整列されるのは通常安全な賭けです。
  • GetExtendedTcpTableまた、2 回目の呼び出しでの戻り値のチェックも怠っています。
于 2013-03-14T10:42:49.143 に答える