共用方式為


MIB_TCPROW_LH 結構 (tcpmib.h)

MIB_TCPROW 結構包含解構 IPv4 TCP 連線的資訊。

語法

typedef struct _MIB_TCPROW_LH {
  union {
    DWORD         dwState;
    MIB_TCP_STATE State;
  };
  DWORD dwLocalAddr;
  DWORD dwLocalPort;
  DWORD dwRemoteAddr;
  DWORD dwRemotePort;
} MIB_TCPROW_LH, *PMIB_TCPROW_LH;

成員

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 專案資訊的數據結構。

State

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位可能包含未初始化的資料。

備註

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

MIB_TCPROW 結構的數位包含在MIB_TCPTABLE結構中。 SetTcpEntry 函式也會使用MIB_TCPROW結構。

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

dwLocalAddrdwRemoteAddr 成員會以與 in_addr 結構相同的格式儲存為 DWORD。 若要使用 dwLocalAddrdwRemoteAddr 成員,可能需要 Windows Sockets 或類似函式中的 ntohlinet_ntoa 函式。 在 Windows Vista 和更新版本上, RtlIpv4AddressToStringRtlIpv4AddressToStringEx 函式可用來將 dwLocalAddrdwRemoteAddr 成員轉換成字符串,而不需載入 Windows Sockets DLL。

dwLocalPortdwRemotePort 成員會依網路位元組順序排列。 若要使用 dwLocalPortdwRemotePort 成員,可能需要 Windows Sockets 或類似函式中的 ntohsinet_ntoa 函式。

MIB_TCPROW 結構在 Windows Vista 和更新版本稍有變更。 在 Windows Vista 和更新版本上, dwState 成員會取代為包含下列成員的等位。

member 描述
DWORD dwState TCP 連線的狀態。
MIB_TCP_STATE狀態 TCP 連線的狀態。 這個成員可以是 tcpmib.h 頭檔中所定義之MIB_TCP_STATE列舉類型的其中一個值。 可能的值與 針對 dwState 成員定義的值相同。
 

在 Windows SDK 中,用於 Windows Vista 和更新版本的 結構版本會定義為MIB_TCPROW_LH。 在 Windows SDK 中,要用於舊版系統上的這個結構版本,包括 Windows 2000 和更新版本會定義為MIB_TCPROW_W2K。 如果目標平臺是 Windows Vista 和更新版本 (、 _WIN32_WINNT >= 0x0600WINVER >= 0x0600) NTDDI_VERSION >= NTDDI_LONGHORN編譯應用程式時,MIB_TCPROW_LH 結構的類型會預設為 MIB_TCPROW 結構。 如果目標平臺不是 Windows Vista 和更新版本,則 編譯應用程式時,MIB_TCPROW_W2K 結構會類型為 MIB_TCPROW 結構。

在針對 Windows Vista 和更新版本發行的 Windows SDK 上,頭文件的組織已變更。 這個結構定義於 Tcpmib.h 頭檔中,而不是 在 Iprtrmib.h 頭檔中。 請注意, Tcpmib.h 頭文件會自動包含在 Iprtrmib.h 中,該檔案會自動包含在 Iphlpapi.h 頭檔中。 不應該直接使用 Tcpmib.hIprtrmib.h 頭檔。

範例

下列範例會擷取 TCP 連接數據表,並列印以 MIB_TCPROW 結構表示的每個連線狀態。

#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_TCPTABLE pTcpTable;
    DWORD dwSize = 0;
    DWORD dwRetVal = 0;

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

    struct in_addr IpAddr;

    int i;

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

    dwSize = sizeof (MIB_TCPTABLE);
// Make an initial call to GetTcpTable to
// get the necessary size into the dwSize variable
    if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, TRUE)) ==
        ERROR_INSUFFICIENT_BUFFER) {
        FREE(pTcpTable);
        pTcpTable = (MIB_TCPTABLE *) MALLOC(dwSize);
        if (pTcpTable == NULL) {
            printf("Error allocating memory\n");
            return 1;
        }
    }
// Make a second call to GetTcpTable to get
// the actual data we require
    if ((dwRetVal = GetTcpTable(pTcpTable, &dwSize, 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:
                printf("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));
        }
    } else {
        printf("\tGetTcpTable failed with %d\n", dwRetVal);
        FREE(pTcpTable);
        return 1;
    }

    if (pTcpTable != NULL) {
        FREE(pTcpTable);
        pTcpTable = NULL;
    }    

    return 0;    
}


規格需求

需求
最低支援的用戶端 Windows 2000 Professional [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限桌面應用程式]
標頭 tcpmib.h (包含Iphlpapi.h)

另請參閱

GetTcp6Table

GetTcp6Table2

GetTcpTable

GetTcpTable2

MIB_TCP6ROW

MIB_TCP6ROW2

MIB_TCP6TABLE

MIB_TCP6TABLE2

MIB_TCPROW2

MIB_TCPTABLE

MIB_TCPTABLE2

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

SetTcpEntry

in_addr

inet_ntoa

ntohl

ntohs