我想通过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”,所以我的机器没有任何问题。
帮助将不胜感激。 提前致谢
答案 0 :(得分:2)
在文档之后,传递AF_INET6
和TCP_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
。
底线是您在界面一侧使用的记录与另一侧使用的结构不匹配。
其他一些评论:
GetExtendedTcpTable
的返回值。