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 枚举类型的值之一。

含义
MIB_TCP_STATE_CLOSED
1
TCP 连接处于“已关闭”状态,表示完全没有连接状态。
MIB_TCP_STATE_LISTEN
2
TCP 连接处于 LISTEN 状态,等待来自任何远程 TCP 和端口的连接请求。
MIB_TCP_STATE_SYN_SENT
3
在发送连接请求后,TCP 连接处于 SYN-SENT 状态,等待匹配的连接请求 (SYN 数据包) 。
MIB_TCP_STATE_SYN_RCVD
4
在收到并发送连接请求后,TCP 连接处于 SYN-RECEIVED 状态,等待确认连接请求确认 (SYN 数据包) 。
MIB_TCP_STATE_ESTAB
5
TCP 连接处于“已建立”状态,表示打开的连接,接收的数据可以传递给用户。 这是 TCP 连接的数据传输阶段的正常状态。
MIB_TCP_STATE_FIN_WAIT1
6
TCP 连接为 FIN-WAIT-1 状态,等待来自远程 TCP 的连接终止请求,或确认之前发送的连接终止请求。
MIB_TCP_STATE_FIN_WAIT2
7
TCP 连接为 FIN-WAIT-1 状态,等待来自远程 TCP 的连接终止请求。
MIB_TCP_STATE_CLOSE_WAIT
8
TCP 连接处于 CLOSE-WAIT 状态,等待来自本地用户的连接终止请求。
MIB_TCP_STATE_CLOSING
9
TCP 连接处于正在关闭状态,等待来自远程 TCP 的连接终止请求确认。
MIB_TCP_STATE_LAST_ACK
10
TCP 连接处于 LAST-ACK 状态,等待确认之前发送到远程 TCP (包括确认其连接终止请求) 。
MIB_TCP_STATE_TIME_WAIT
11
TCP 连接处于 TIME-WAIT 状态,等待足够的时间通过,以确保远程 TCP 收到对其连接终止请求的确认。
MIB_TCP_STATE_DELETE_TCB
12
TCP 连接处于删除 TCB 状态,表示删除传输控制块 (TCB) ,该数据结构用于维护每个 TCP 条目的信息。

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

dwLocalPortdwRemotePort 成员按网络字节顺序排列。 若要使用 dwLocalPortdwRemotePort 成员,可能需要 Windows 套接字中的 ntohsinet_ntoa 函数或类似函数。

dwLocalScopeIddwRemoteScopeId 成员按网络字节顺序排列。 若要使用 dwLocalScopeIddwRemoteScopeId 成员,可能需要 Windows 套接字中的 ntohlinet_ntoa 函数或类似函数。

LocalAddrRemoteAddr 成员存储在in6_addr结构中。 RtlIpv6AddressToStringRtlIpv6AddressToStringEx 函数可用于在不加载 Windows 套接字 DLL 的情况下将 LocalAddrRemoteAddr 成员中的 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)

另请参阅

GetTcp6Table

MIB_TCP6TABLE

MIB_TCPROW

MIB_TCPTABLE

RtlIpv6AddressToString

RtlIpv6AddressToStringEx

in6_addr

inet_ntoa

ntohl

ntohs