MIB_TCP6ROW 结构 (tcpmib.h)
MIB_TCP6ROW结构包含描述 IPv6 TCP 连接的信息。
语法
typedef struct _MIB_TCP6ROW {
MIB_TCP_STATE State;
IN6_ADDR LocalAddr;
DWORD dwLocalScopeId;
DWORD dwLocalPort;
IN6_ADDR RemoteAddr;
DWORD dwRemoteScopeId;
DWORD dwRemotePort;
} MIB_TCP6ROW, *PMIB_TCP6ROW;
成员
State
类型: MIB_TCP_STATE
TCP 连接的状态。 此成员可以是 Tcpmib.h 头文件中定义的 MIB_TCP_STATE 枚举类型的值之一。
LocalAddr
类型: IN6_ADDR
本地计算机上的 TCP 连接的本地 IPv6 地址。 值为零表示侦听器可以接受任何接口上的连接。
dwLocalScopeId
类型:DWORD
本地计算机上的 TCP 连接的本地范围 ID。
dwLocalPort
类型:DWORD
本地计算机上的 TCP 连接的本地端口号(按网络字节顺序)。
IP 端口号的最大大小为 16 位,因此只应使用较低的 16 位。 上限 16 位可能包含未初始化的数据。
RemoteAddr
类型: IN6_ADDR
远程计算机上的 TCP 连接的 IPv6 地址。 当 状态 成员 MIB_TCP_STATE_LISTEN时,此值没有任何意义。
dwRemoteScopeId
类型:DWORD
远程计算机上的 TCP 连接的远程范围 ID。 当 状态 成员 MIB_TCP_STATE_LISTEN时,此值没有任何意义。
dwRemotePort
类型:DWORD
远程计算机上的 TCP 连接的远程端口号(按网络字节顺序)。 当 状态 成员 MIB_TCP_STATE_LISTEN时,此值没有任何意义。
IP 端口号的最大大小为 16 位,因此只应使用较低的 16 位。 上限 16 位可能包含未初始化的数据。
注解
MIB_TCP6ROW结构在 Windows Vista 及更高版本上定义。
GetTcp6Table 函数检索本地计算机上的 IPv6 TCP 连接表,并在MIB_TCP6TABLE结构中返回此信息。
MIB_TCP6TABLE 结构中包含一个由MIB_TCP6ROW结构构成的数组。
状态成员指示 TCP 状态图中 TCP 条目的状态。 TCP 连接在其生存期内通过一系列状态进行。 状态为:LISTEN、SYN-SENT、SYN-RECEIVED、已建立、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSE-WAIT、CLOSE-ACK、TIME-WAIT 和虚构状态 CLOSED。 关闭状态是虚构的,因为它表示没有传输控制块时的状态,因此没有连接。 RFC 793 中介绍了 TCP 协议。 有关详细信息,请参阅 http://www.ietf.org/rfc/rfc793.txt。
dwLocalPort 和 dwRemotePort 成员按网络字节顺序排列。 若要使用 dwLocalPort 或 dwRemotePort 成员,可能需要 Windows 套接字中的 ntohs 或 inet_ntoa 函数或类似函数。
dwLocalScopeId 和 dwRemoteScopeId 成员按网络字节顺序排列。 若要使用 dwLocalScopeId 或 dwRemoteScopeId 成员,可能需要 Windows 套接字中的 ntohl 或 inet_ntoa 函数或类似函数。
LocalAddr 和 RemoteAddr 成员存储在in6_addr结构中。 RtlIpv6AddressToString 或 RtlIpv6AddressToStringEx 函数可用于在不加载 Windows 套接字 DLL 的情况下将 LocalAddr 或 RemoteAddr 成员中的 IPv6 地址转换为字符串。
示例
以下示例检索 IPv6 的 TCP 连接表,并输出表示为 MIB_TCP6ROW 结构的每个连接的状态。
#define UNICODE 1
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
// Need to link with Iphlpapi.lib and Ws2_32.lib
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/* Note: could also use malloc() and free() */
int wmain()
{
// Declare and initialize variables
PMIB_TCP6TABLE pTcpTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
wchar_t ipstringbuffer[46];
int i;
pTcpTable = (MIB_TCP6TABLE *) MALLOC(sizeof (MIB_TCP6TABLE));
if (pTcpTable == NULL) {
wprintf(L"Error allocating memory\n");
return 1;
}
dwSize = sizeof (MIB_TCP6TABLE);
// Make an initial call to GetTcp6Table to
// get the necessary size into the dwSize variable
if ((dwRetVal = GetTcp6Table(pTcpTable, &dwSize, TRUE)) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pTcpTable);
pTcpTable = (MIB_TCP6TABLE *) MALLOC(dwSize);
if (pTcpTable == NULL) {
wprintf(L"Error allocating memory\n");
return 1;
}
}
// Make a second call to GetTcp6Table to get
// the actual data we require
if ((dwRetVal = GetTcp6Table(pTcpTable, &dwSize, TRUE)) == NO_ERROR) {
wprintf(L"\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);
for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
wprintf(L"\n\tTCP[%d] State: %ld - ", i,
pTcpTable->table[i].State);
switch (pTcpTable->table[i].State) {
case MIB_TCP_STATE_CLOSED:
wprintf(L"CLOSED\n");
break;
case MIB_TCP_STATE_LISTEN:
wprintf(L"LISTEN\n");
break;
case MIB_TCP_STATE_SYN_SENT:
wprintf(L"SYN-SENT\n");
break;
case MIB_TCP_STATE_SYN_RCVD:
wprintf(L"SYN-RECEIVED\n");
break;
case MIB_TCP_STATE_ESTAB:
wprintf(L"ESTABLISHED\n");
break;
case MIB_TCP_STATE_FIN_WAIT1:
wprintf(L"FIN-WAIT-1\n");
break;
case MIB_TCP_STATE_FIN_WAIT2:
wprintf(L"FIN-WAIT-2 \n");
break;
case MIB_TCP_STATE_CLOSE_WAIT:
wprintf(L"CLOSE-WAIT\n");
break;
case MIB_TCP_STATE_CLOSING:
wprintf(L"CLOSING\n");
break;
case MIB_TCP_STATE_LAST_ACK:
wprintf(L"LAST-ACK\n");
break;
case MIB_TCP_STATE_TIME_WAIT:
wprintf(L"TIME-WAIT\n");
break;
case MIB_TCP_STATE_DELETE_TCB:
wprintf(L"DELETE-TCB\n");
break;
default:
wprintf(L"UNKNOWN dwState value\n");
break;
}
if (InetNtop(AF_INET6, &pTcpTable->table[i].LocalAddr, ipstringbuffer, 46) == NULL)
wprintf(L" InetNtop function failed for local IPv6 address\n");
else
wprintf(L"\tTCP[%d] Local Addr: %s\n", i, ipstringbuffer);
wprintf(L"\tTCP[%d] Local Scope ID: %d \n", i,
ntohl (pTcpTable->table[i].dwLocalScopeId));
wprintf(L"\tTCP[%d] Local Port: %d \n", i,
ntohs((u_short)pTcpTable->table[i].dwLocalPort));
if (InetNtop(AF_INET6, &pTcpTable->table[i].RemoteAddr, ipstringbuffer, 46) == NULL)
wprintf(L" InetNtop function failed for remote IPv6 address\n");
else
wprintf(L"\tTCP[%d] Remote Addr: %s\n", i, ipstringbuffer);
wprintf(L"\tTCP[%d] Remote Scope ID: %d \n", i,
ntohl(pTcpTable->table[i].dwRemoteScopeId));
wprintf(L"\tTCP[%d] Remote Port: %d\n", i,
ntohs((u_short)pTcpTable->table[i].dwRemotePort));
}
} else {
wprintf(L"\tGetTcp6Table failed with %d\n", dwRetVal);
FREE(pTcpTable);
return 1;
}
if (pTcpTable != NULL) {
FREE(pTcpTable);
pTcpTable = NULL;
}
return 0;
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows Vista [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 [仅限桌面应用] |
标头 | tcpmib.h (包括 Iphlpapi.h) |