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.h 和 Iprtrmib.h 頭檔。
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。
dwLocalAddr 和 dwRemoteAddr 成員會以與 in_addr 結構相同的格式儲存為 DWORD。 若要使用 dwLocalAddr 或 dwRemoteAddr 成員,可能需要 Windows Sockets 或類似函式中的 ntohl 或 inet_ntoa 函式。 在 Windows Vista 和更新版本上, RtlIpv4AddressToString 或 RtlIpv4AddressToStringEx 函式可用來將 dwLocalAddr 或 dwRemoteAddr 成員轉換成字符串,而不需載入 Windows Sockets DLL。
dwLocalPort 和 dwRemotePort 成員會依網路位元組順序排列。 若要使用 dwLocalPort 或 dwRemotePort 成員,可能需要 Windows Sockets 或類似函式中的 ntohs 或 inet_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 >= 0x0600
或 WINVER >= 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.h 和 Iprtrmib.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) |
另請參閱
MIB_TCP6ROW2