Partager via


structure MIB_TCPROW_LH (tcpmib.h)

La structure MIB_TCPROW contient des informations qui désintèdent une connexion TCP IPv4.

Syntaxe

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;

Membres

dwState

Type : DWORD

État de la connexion TCP. Ce membre peut être l’une des valeurs définies dans le fichier d’en-tête Iprtrmib.h .

Sur le SDK Windows publié pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé. Ce membre peut être l’une des valeurs de l’énumération MIB_TCP_STATE définie dans le fichier d’en-tête Tcpmib.h , et non dans le fichier d’en-tête Iprtrmib.h . Notez que le fichier d’en-tête Tcpmib.h est automatiquement inclus dans Iprtrmib.h, qui est automatiquement inclus dans le fichier d’en-tête Iphlpapi.h . Les fichiers d’en-tête Tcpmib.h et Iprtrmib.h ne doivent jamais être utilisés directement.

Valeur Signification
MIB_TCP_STATE_CLOSED
1
La connexion TCP est à l’état FERMÉ qui ne représente aucun état de connexion.
MIB_TCP_STATE_LISTEN
2
La connexion TCP est à l’état LISTEN en attente d’une demande de connexion à partir d’un port et d’un port TCP distants.
MIB_TCP_STATE_SYN_SENT
3
La connexion TCP est à l’état SYN-SENT en attente d’une demande de connexion correspondante après avoir envoyé une demande de connexion (paquet SYN).
MIB_TCP_STATE_SYN_RCVD
4
La connexion TCP est à l’état SYN-RECEIVED en attente d’un accusé de réception de demande de connexion de confirmation après avoir reçu et envoyé une demande de connexion (paquet SYN).
MIB_TCP_STATE_ESTAB
5
La connexion TCP est à l’état ESTABLISHED qui représente une connexion ouverte. Les données reçues peuvent être remises à l’utilisateur. Il s’agit de l’état normal pour la phase de transfert de données de la connexion TCP.
MIB_TCP_STATE_FIN_WAIT1
6
La connexion TCP est à l’état FIN-WAIT-1 en attente d’une demande d’arrêt de connexion à partir du TCP distant ou d’un accusé de réception de la demande d’arrêt de connexion précédemment envoyée.
MIB_TCP_STATE_FIN_WAIT2
7
La connexion TCP est à l’état FIN-WAIT-1 en attente d’une demande d’arrêt de connexion à partir du TCP distant.
MIB_TCP_STATE_CLOSE_WAIT
8
La connexion TCP est à l’état CLOSE-WAIT en attente d’une demande d’arrêt de connexion de la part de l’utilisateur local.
MIB_TCP_STATE_CLOSING
9
La connexion TCP est à l’état CLOSING en attente d’un accusé de réception de demande d’arrêt de connexion à partir du TCP distant.
MIB_TCP_STATE_LAST_ACK
10
La connexion TCP est à l’état LAST-ACK en attente d’un accusé de réception de la demande d’arrêt de connexion précédemment envoyée au TCP distant (qui comprend un accusé de réception de sa demande d’arrêt de connexion).
MIB_TCP_STATE_TIME_WAIT
11
La connexion TCP est à l’état TIME-WAIT en attendant suffisamment de temps pour s’assurer que le TCP distant a reçu l’accusé de réception de sa demande d’arrêt de connexion.
MIB_TCP_STATE_DELETE_TCB
12
La connexion TCP est dans l’état de suppression du TCB qui représente la suppression du bloc de contrôle de transmission (TCB), une structure de données utilisée pour gérer les informations sur chaque entrée TCP.

State

dwLocalAddr

Type : DWORD

Adresse IPv4 locale pour la connexion TCP sur l’ordinateur local. La valeur zéro indique que l’écouteur peut accepter une connexion sur n’importe quelle interface.

dwLocalPort

Type : DWORD

Numéro de port local dans l’ordre d’octet réseau de la connexion TCP sur l’ordinateur local.

La taille maximale d’un numéro de port IP étant de 16 bits, seuls les 16 bits inférieurs doivent être utilisés. Les 16 bits supérieurs peuvent contenir des données non initialisées.

dwRemoteAddr

Type : DWORD

Adresse IPv4 de la connexion TCP sur l’ordinateur distant. Lorsque le membre dwState est MIB_TCP_STATE_LISTEN, cette valeur n’a aucune signification.

dwRemotePort

Type : DWORD

Numéro de port distant dans l’ordre d’octet réseau de la connexion TCP sur l’ordinateur distant. Lorsque le membre dwState est MIB_TCP_STATE_LISTEN, ce membre n’a aucune signification.

La taille maximale d’un numéro de port IP étant de 16 bits, seuls les 16 bits inférieurs doivent être utilisés. Les 16 bits supérieurs peuvent contenir des données non initialisées.

Remarques

La fonction GetTcpTable récupère la table de connexion TCP IPv4 sur l’ordinateur local et retourne ces informations dans une structure MIB_TCPTABLE .

Un tableau de structures MIB_TCPROW est contenu dans la structure MIB_TCPTABLE . La structure MIB_TCPROW est également utilisée par la fonction SetTcpEntry .

Le membre dwState indique l’état de l’entrée TCP dans un diagramme d’état TCP. Une connexion TCP progresse à travers une série d’états au cours de sa durée de vie. Les états sont : LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT et l’état fictif FERMÉ. L’état FERMÉ est fictif, car il représente l’état lorsqu’il n’existe aucun bloc de contrôle de transmission et, par conséquent, aucune connexion. Le protocole TCP est décrit dans RFC 793. Pour plus d’informations, consultez http://www.ietf.org/rfc/rfc793.txt.

Les membres dwLocalAddr et dwRemoteAddr sont stockés en tant que DWORD au même format que la structure in_addr . Pour utiliser les membres dwLocalAddr ou dwRemoteAddr , les fonctions ntohl ou inet_ntoa dans les sockets Windows ou des fonctions similaires peuvent être nécessaires. Sur Windows Vista et versions ultérieures, les fonctions RtlIpv4AddressToString ou RtlIpv4AddressToStringEx peuvent être utilisées pour convertir l’adresse IPv4 dans les membres dwLocalAddr ou dwRemoteAddr en chaîne sans charger la DLL windows Sockets.

Les membres dwLocalPort et dwRemotePort sont dans l’ordre d’octet réseau. Pour utiliser les membres dwLocalPort ou dwRemotePort , les fonctions ntohs ou inet_ntoa dans les sockets Windows ou des fonctions similaires peuvent être nécessaires.

La structure MIB_TCPROW a légèrement changé sur Windows Vista et versions ultérieures. Sur Windows Vista et versions ultérieures, le membre dwState est remplacé par une union qui contient les membres suivants.

Membre Description
DWORD dwState État de la connexion TCP.
état MIB_TCP_STATE État de la connexion TCP. Ce membre peut être l’une des valeurs du type d’énumération MIB_TCP_STATE défini dans le fichier d’en-tête Tcpmib.h . Les valeurs possibles sont les mêmes que celles définies pour le membre dwState .
 

Dans le SDK Windows, la version de la structure à utiliser sur Windows Vista et versions ultérieures est définie comme MIB_TCPROW_LH. Dans le SDK Windows, la version de cette structure à utiliser sur les systèmes antérieurs, y compris Windows 2000 et versions ultérieures, est définie comme MIB_TCPROW_W2K. Lors de la compilation d’une application si la plateforme cible est Windows Vista et versions ultérieures (NTDDI_VERSION >= NTDDI_LONGHORN, _WIN32_WINNT >= 0x0600, ou WINVER >= 0x0600), la structure MIB_TCPROW_LH est typée à la structure MIB_TCPROW . Lors de la compilation d’une application si la plateforme cible n’est pas Windows Vista et versions ultérieures, la structure MIB_TCPROW_W2K est typée à la structure MIB_TCPROW .

Sur le SDK Windows publié pour Windows Vista et versions ultérieures, la organization des fichiers d’en-tête a changé. Cette structure est définie dans le fichier d’en-tête Tcpmib.h , et non dans le fichier d’en-tête Iprtrmib.h . Notez que le fichier d’en-tête Tcpmib.h est automatiquement inclus dans Iprtrmib.h, qui est automatiquement inclus dans le fichier d’en-tête Iphlpapi.h . Les fichiers d’en-tête Tcpmib.h et Iprtrmib.h ne doivent jamais être utilisés directement.

Exemples

L’exemple suivant récupère la table de connexion TCP et imprime l’état de chaque connexion représentée sous la forme d’une structure de 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;    
}


Configuration requise

Condition requise Valeur
Client minimal pris en charge Windows 2000 Professionnel [applications de bureau uniquement]
Serveur minimal pris en charge Windows 2000 Server [applications de bureau uniquement]
En-tête tcpmib.h (include Iphlpapi.h)

Voir aussi

GetTcp6Table

GetTcp6Table2

GetTcpTable

GetTcpTable2

MIB_TCP6ROW

MIB_TCP6ROW2

MIB_TCP6TABLE

MIB_TCP6TABLE2

MIB_TCPROW2

MIB_TCPTABLE

MIB_TCPTABLE2

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

SetTcpEntry

in_addr

inet_ntoa

ntohl

ntohs