GetTcpTable-Funktion (iphlpapi.h)
Die GetTcpTable-Funktion ruft die IPv4-TCP-Verbindungstabelle ab.
Syntax
IPHLPAPI_DLL_LINKAGE ULONG GetTcpTable(
[out] PMIB_TCPTABLE TcpTable,
[in, out] PULONG SizePointer,
[in] BOOL Order
);
Parameter
[out] TcpTable
Ein Zeiger auf einen Puffer, der die TCP-Verbindungstabelle als MIB_TCPTABLE-Struktur empfängt.
[in, out] SizePointer
Gibt bei der Eingabe die Größe des Puffers in Byte an, auf den der pTcpTable-Parameter verweist.
Wenn der Puffer bei der Ausgabe nicht groß genug ist, um die zurückgegebene Verbindungstabelle zu enthalten, legt die Funktion diesen Parameter gleich der erforderlichen Puffergröße in Bytes fest.
Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wird der Datentyp für diesen Parameter in einen PULONG-Wert geändert, der einem PDWORD entspricht.
[in] Order
Ein boolescher Wert, der angibt, ob die TCP-Verbindungstabelle sortiert werden soll. Wenn dieser Parameter TRUE ist, wird die Tabelle in der Reihenfolge sortiert:
- Lokale IP-Adresse
- Lokaler Port
- Remote-IP-Adresse
- Remoteport
Rückgabewert
Wenn die Funktion erfolgreich ist, wird der Rückgabewert NO_ERROR.
Wenn die Funktion fehlschlägt, ist der Rückgabewert einer der folgenden Fehlercodes.
Rückgabecode | Beschreibung |
---|---|
|
Der Puffer, auf den der pTcpTable-Parameter verweist, ist nicht groß genug. Die erforderliche Größe wird in der DWORD-Variablen zurückgegeben, auf die der pdwSize-Parameter verweist.
Dieser Fehler wird auch zurückgegeben, wenn der pTcpTable-ParameterNULL ist. |
|
Der pdwSize-Parameter ist NULL, oder GetTcpTable kann nicht in den Speicher schreiben, auf den der pdwSize-Parameter verweist. |
|
Diese Funktion wird auf dem Betriebssystem, das auf dem lokalen System verwendet wird, nicht unterstützt. |
|
Wenn Sie diesen Rückgabecode erhalten, reicht das erneute Aufrufen der Funktion in der Regel aus, um das Problem zu beheben und das gewünschte Ergebnis zu erhalten. Dieser Rückgabecode kann eine Folge einer hohen Auslastung des Systems sein. Beispiel: Die Größe der TCP-Verbindungstabelle ändert sich 3 aufeinanderfolgende Male um mehr als zwei zusätzliche Elemente. |
|
Verwenden Sie FormatMessage , um die Meldungszeichenfolge für den zurückgegebenen Fehler abzurufen. |
Hinweise
Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wird der Rückgabewert der GetTcpTable-Funktion in einen Datentyp von ULONG geändert, der einem DWORD entspricht.
Beispiele
Im folgenden Beispiel wird die TCP-Verbindungstabelle für IPv4 abgerufen und der Status jeder Verbindung ausgegeben.
// Need to link with Iphlpapi.lib and Ws2_32.lib
#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>
#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++) {
IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwLocalAddr;
strcpy_s(szLocalAddr, sizeof (szLocalAddr), inet_ntoa(IpAddr));
IpAddr.S_un.S_addr = (u_long) pTcpTable->table[i].dwRemoteAddr;
strcpy_s(szRemoteAddr, sizeof (szRemoteAddr), inet_ntoa(IpAddr));
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\n");
break;
}
printf("\tTCP[%d] Local Addr: %s\n", i, szLocalAddr);
printf("\tTCP[%d] Local Port: %d \n", i,
ntohs((u_short)pTcpTable->table[i].dwLocalPort));
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;
}
Anforderungen
Unterstützte Mindestversion (Client) | Windows 2000 Professional [Desktop-Apps | UWP-Apps] |
Unterstützte Mindestversion (Server) | Windows 2000 Server [Desktop-Apps | UWP-Apps] |
Zielplattform | Windows |
Kopfzeile | iphlpapi.h |
Bibliothek | Iphlpapi.lib |
DLL | Iphlpapi.dll |