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.h 和 Iprtrmib.h 標頭檔。
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。
dwLocalPort和dwRemotePort成員會依網路位元組順序排列。 若要使用 dwLocalPort 或 dwRemotePort 成員,可能需要 Windows Sockets 或類似函式中的 ntohs 或 inet_ntoa 函式。 dwLocalAddr和dwRemoteAddr成員會以與 in_addr結構相同的格式儲存為DWORD。 若要使用 dwLocalAddr 或 dwRemoteAddr 成員,可能需要 Windows Sockets 或類似函式中的 ntohl 或 inet_ntoa 函式。 在 Windows Vista 和更新版本上, RtlIpv4AddressToString 或 RtlIpv4AddressToStringEx 函式可用來將 dwLocalAddr 或 dwRemoteAddr 成員中的 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) |