2013-03-14 92 views
2

我想通过Delphi 7中的GetExtendedTcpTable查看TCP和UDP协议的IPV6连接。我编写了代码来显示连接信息。问题是我的连接状态为“0”。据我所知,有效状态是1-12。下面是我的代码,有人能指出这个错误。为什么我在GetExtendedTcpTable中连接状态为0

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”,因此我的机器没有任何问题。

帮助将不胜感激。 在此先感谢

+0

@DavidHeffernan:我们已经成功地将这些定义用于IPV4。我只是将它们复制到这里。不,C++头文件不使用打包记录。至于函数返回部分,它只是一个演示代码。 – CyprUS 2013-03-14 10:38:58

回答

2

以下的文档,似乎通过AF_INET6TCP_TABLE_OWNER_PID_ALL时返回的结构是MIB_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的返回值。
+0

谢谢。它现在有效。状态现在作为聆听模式 – CyprUS 2013-03-14 10:59:51

+0

我的结构有错误的成员顺序。 – CyprUS 2013-03-14 11:37:07

相关问题