Partager via


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 :

  1. Adresse IP locale
  2. Port local
  3. Adresse IP distante
  4. 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
ERROR_INSUFFICIENT_BUFFER
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.

ERROR_INVALID_PARAMETER
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 .
ERROR_NOT_SUPPORTED
Cette fonction n’est pas prise en charge sur le système d’exploitation utilisé sur le système local.
STATUS_UNSUCCESSFUL
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.
Autres
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

Voir aussi

GetExtendedTcpTable

GetOwnerModuleFromTcpEntry

GetTcp6Table

GetTcp6Table2

GetTcpStatistics

GetTcpStatisticsEx

GetTcpTable2

MIB_TCPROW

MIB_TCPROW_OWNER_MODULE

MIB_TCPROW_OWNER_PID

MIB_TCPTABLE

MIB_TCPTABLE_OWNER_MODULE

MIB_TCPTABLE_OWNER_PID

SetTcpEntry