2013-03-14 71 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