GetTcpTable, fonction (iphlpapi.h)
La fonction GetTcpTable récupère la table de connexion TCP IPv4.
Syntaxe
IPHLPAPI_DLL_LINKAGE ULONG GetTcpTable(
[out] PMIB_TCPTABLE TcpTable,
[in, out] PULONG SizePointer,
[in] BOOL Order
);
Paramètres
[out] TcpTable
Pointeur vers une mémoire tampon qui reçoit la table de connexion TCP en tant que structure MIB_TCPTABLE .
[in, out] SizePointer
Lors de l’entrée, spécifie la taille en octets de la mémoire tampon pointée par le paramètre pTcpTable .
En sortie, si la mémoire tampon n’est pas assez grande pour contenir la table de connexion retournée, la fonction définit ce paramètre comme étant égal à la taille de mémoire tampon requise en octets.
Sur le Kit de développement logiciel (SDK) Windows publié pour Windows Vista et versions ultérieures, le type de données de ce paramètre est remplacé par un PULONG qui équivaut à un PDWORD.
[in] Order
Valeur booléenne qui spécifie si la table de connexion TCP doit être triée. Si ce paramètre a la valeur TRUE, la table est triée dans l’ordre de :
- Adresse IP locale
- Port local
- Adresse IP distante
- Port distant
Valeur retournée
Si la fonction réussit, la valeur de retour est NO_ERROR.
Si la fonction échoue, la valeur de retour est l’un des codes d’erreur suivants.
Code de retour | Description |
---|---|
|
La mémoire tampon pointée vers le paramètre pTcpTable n’est pas assez grande. La taille requise est retournée dans la variable DWORD pointée vers le paramètre pdwSize .
Cette erreur est également retournée si le paramètre pTcpTable a la valeur NULL. |
|
Le paramètre pdwSize a la valeur NULL ou GetTcpTable ne peut pas écrire dans la mémoire pointée par le paramètre pdwSize . |
|
Cette fonction n’est pas prise en charge sur le système d’exploitation utilisé sur le système local. |
|
Si vous recevez ce code de retour, l’appel de la fonction est généralement suffisant pour effacer le problème et obtenir le résultat souhaité. Ce code de retour peut être une conséquence du fait que le système est soumis à une charge élevée. Par exemple, si la taille de la table de connexion TCP change de plus de 2 éléments supplémentaires 3 fois consécutives. |
|
Utilisez FormatMessage pour obtenir la chaîne de message pour l’erreur retournée. |
Notes
Sur le Kit de développement logiciel (SDK) Windows publié pour Windows Vista et versions ultérieures, la valeur de retour de la fonction GetTcpTable est remplacée par un type de données ULONG qui équivaut à un DWORD.
Exemples
L’exemple suivant récupère la table de connexion TCP pour IPv4 et imprime l’état de chaque connexion.
// 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;
}
Configuration requise
Client minimal pris en charge | Windows 2000 Professionnel [applications de bureau | Applications UWP] |
Serveur minimal pris en charge | Windows 2000 Server [applications de bureau | Applications UWP] |
Plateforme cible | Windows |
En-tête | iphlpapi.h |
Bibliothèque | Iphlpapi.lib |
DLL | Iphlpapi.dll |