共用方式為


MIB_TCPROW2 結構 (tcpmib.h)

MIB_TCPROW2結構包含描述 IPv4 TCP 連線的資訊。

語法

typedef struct _MIB_TCPROW2 {
  DWORD                        dwState;
  DWORD                        dwLocalAddr;
  DWORD                        dwLocalPort;
  DWORD                        dwRemoteAddr;
  DWORD                        dwRemotePort;
  DWORD                        dwOwningPid;
  TCP_CONNECTION_OFFLOAD_STATE dwOffloadState;
} MIB_TCPROW2, *PMIB_TCPROW2;

成員

dwState

類型: DWORD

TCP 連線的狀態。 這個成員可以是 Iprtrmib.h 標頭檔中定義的其中一個值。

在針對 Windows Vista 和更新版本發行的 Windows SDK 上,標頭檔的組織已變更。 這個成員可以是Tcpmib.h標頭檔中定義的MIB_TCP_STATE列舉值之一,而不是Iprtrmib.h標頭檔中。 請注意, Tcpmib.h 標頭檔會自動包含在 Iprtrmib.h中,該檔案會自動包含在 Iphlpapi.h 標頭檔中。 不應該直接使用 Tcpmib.hIprtrmib.h 標頭檔。

意義
MIB_TCP_STATE_CLOSED
1
TCP 連線處於 CLOSED 狀態,完全不代表任何線上狀態。
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 連線處於 ESTABLISHED 狀態,代表開啟的連線,接收的資料可以傳遞給使用者。 這是 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 連線處於 CLOSING 狀態,正在等候遠端 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 專案資訊的資料結構。

dwLocalAddr

類型: DWORD

本機電腦上的 TCP 連線本機 IPv4 位址。 值為零表示接聽程式可以接受任何介面上的連接。

dwLocalPort

類型: DWORD

本機電腦上 TCP 連線的網路位元組順序中的本機埠號碼。

IP 埠號碼的大小上限為 16 位,因此應該只使用較低的 16 位。 上層 16 位可能包含未初始化的資料。

dwRemoteAddr

類型: DWORD

遠端電腦上的 TCP 連線 IPv4 位址。 當 dwState 成員 MIB_TCP_STATE_LISTEN時,這個值就沒有意義。

dwRemotePort

類型: DWORD

遠端電腦上 TCP 連線的網路位元組順序中的遠端埠號碼。 當 dwState 成員 MIB_TCP_STATE_LISTEN時,這個成員沒有任何意義。

IP 埠號碼的大小上限為 16 位,因此應該只使用較低的 16 位。 上層 16 位可能包含未初始化的資料。

dwOwningPid

類型: DWORD

發出此 TCP 線上內容系結之進程的 PID。

dwOffloadState

類型: TCP_CONNECTION_OFFLOAD_STATE

此 TCP 連線的卸載狀態。 此參數可以是Tcpmib.h標頭中所定義TCP_CONNECTION_OFFLOAD_STATE的其中一個列舉值。

備註

GetTcpTable2函式會擷取本機電腦上的 IPv4 TCP 連線資料表,並在MIB_TCPTABLE2結構中傳回這項資訊。

MIB_TCPROW2結構的陣列包含在MIB_TCPTABLE2結構中。

dwState成員表示 TCP 狀態圖表中 TCP 專案的狀態。 TCP 連線會在其存留期間透過一系列狀態進行。 狀態為:LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT,以及虛構狀態 CLOSED。 CLOSED 狀態是虛構的,因為它代表沒有傳輸控制區塊時的狀態,因此沒有連線。 RFC 793 會說明 TCP 通訊協定。 如需詳細資訊,請參閱http://www.ietf.org/rfc/rfc793.txt

dwLocalPortdwRemotePort成員會依網路位元組順序排列。 若要使用 dwLocalPortdwRemotePort 成員,可能需要 Windows Sockets 或類似函式中的 ntohsinet_ntoa 函式。 dwLocalAddrdwRemoteAddr成員會以與 in_addr結構相同的格式儲存為DWORD。 若要使用 dwLocalAddrdwRemoteAddr 成員,可能需要 Windows Sockets 或類似函式中的 ntohlinet_ntoa 函式。 在 Windows Vista 和更新版本上, RtlIpv4AddressToStringRtlIpv4AddressToStringEx 函式可用來將 dwLocalAddrdwRemoteAddr 成員中的 IPv4 位址轉換成字串,而不載入 Windows Sockets DLL。

範例

下列範例會擷取 IPv4 的 TCP 連線資料表,並列印以 MIB_TCPROW2 結構表示的每個線上狀態。

#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 main()
{

    // Declare and initialize variables
    PMIB_TCPTABLE2 pTcpTable;
    ULONG ulSize = 0;
    DWORD dwRetVal = 0;

    char szLocalAddr[128];
    char szRemoteAddr[128];

    struct in_addr IpAddr;

    int i;

    pTcpTable = (MIB_TCPTABLE2 *) MALLOC(sizeof (MIB_TCPTABLE2));
    if (pTcpTable == NULL) {
        printf("Error allocating memory\n");
        return 1;
    }

    ulSize = sizeof (MIB_TCPTABLE);
// Make an initial call to GetTcpTable2 to
// get the necessary size into the ulSize variable
    if ((dwRetVal = GetTcpTable2(pTcpTable, &ulSize, TRUE)) ==
        ERROR_INSUFFICIENT_BUFFER) {
        FREE(pTcpTable);
        pTcpTable = (MIB_TCPTABLE2 *) MALLOC(ulSize);
        if (pTcpTable == NULL) {
            printf("Error allocating memory\n");
            return 1;
        }
    }
// Make a second call to GetTcpTable2 to get
// the actual data we require
    if ((dwRetVal = GetTcpTable2(pTcpTable, &ulSize, TRUE)) == NO_ERROR) {
        printf("\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);
        for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
            printf("\n\tTCP[%d] State: %ld - ", i,
                   pTcpTable->table[i].dwState);
            switch (pTcpTable->table[i].dwState) {
            case MIB_TCP_STATE_CLOSED:
                printf("CLOSED\n");
                break;
            case MIB_TCP_STATE_LISTEN:
                printf("LISTEN\n");
                break;
            case MIB_TCP_STATE_SYN_SENT:
                printf("SYN-SENT\n");
                break;
            case MIB_TCP_STATE_SYN_RCVD:
                printf("SYN-RECEIVED\n");
                break;
            case MIB_TCP_STATE_ESTAB:
                printf("ESTABLISHED\n");
                break;
            case MIB_TCP_STATE_FIN_WAIT1:
                printf("FIN-WAIT-1\n");
                break;
            case MIB_TCP_STATE_FIN_WAIT2:
                printf("FIN-WAIT-2 \n");
                break;
            case MIB_TCP_STATE_CLOSE_WAIT:
                printf("CLOSE-WAIT\n");
                break;
            case MIB_TCP_STATE_CLOSING:
                printf("CLOSING\n");
                break;
            case MIB_TCP_STATE_LAST_ACK:
                printf("LAST-ACK\n");
                break;
            case MIB_TCP_STATE_TIME_WAIT:
                printf("TIME-WAIT\n");
                break;
            case MIB_TCP_STATE_DELETE_TCB:
                printf("DELETE-TCB\n");
                break;
            default:
                wprintf(L"UNKNOWN dwState value: %d\n", pTcpTable->table[i].dwState);
                break;
            }

            IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
            strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));
            printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);

            printf("\tTCP[%d] Local Port: %d \n", i,
                   ntohs((u_short)pTcpTable->table[i].dwLocalPort));

            IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;
            strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr));
            printf("\tTCP[%d] Remote Addr: %s\n", i, szRemoteAddr);

            printf("\tTCP[%d] Remote Port: %d\n", i,
                   ntohs((u_short)pTcpTable->table[i].dwRemotePort));
                   
            printf("\tTCP[%d] Owning PID: %d\n", i, pTcpTable->table[i].dwOwningPid);

            printf("\tTCP[%d] Offload State: %ld - ", i,
                   pTcpTable->table[i].dwOffloadState);
            switch (pTcpTable->table[i].dwOffloadState) {
            case TcpConnectionOffloadStateInHost:
                printf("Owned by the network stack and not offloaded \n");
                break;
            case TcpConnectionOffloadStateOffloading:
                printf("In the process of being offloaded\n");
                break;
            case TcpConnectionOffloadStateOffloaded:
                printf("Offloaded to the network interface control\n");
                break;
            case TcpConnectionOffloadStateUploading:
                printf("In the process of being uploaded back to the network stack \n");
                break;
            default:
                printf("UNKNOWN Offload state value\n");
                break;
            }
                   
        }
    } else {
        printf("\tGetTcpTable2 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

GetTcp6Table2

GetTcpTable

GetTcpTable2

MIB_TCP6ROW

MIB_TCP6ROW2

MIB_TCP6TABLE

MIB_TCP6TABLE2

MIB_TCPTABLE

MIB_TCPTABLE2

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

SetTcpEntry

TCP_CONNECTION_OFFLOAD_STATE

in_addr

inet_ntoa

ntohl

ntohs