structure MIB_TCPROW2 (tcpmib.h)
La structure MIB_TCPROW2 contient des informations qui décrivent une connexion TCP IPv4.
Syntaxe
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;
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 Kit de développement logiciel (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.
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.
dwOwningPid
Type : DWORD
PID du processus qui a émis une liaison de contexte pour cette connexion TCP.
dwOffloadState
Type : TCP_CONNECTION_OFFLOAD_STATE
État de déchargement de cette connexion TCP. Ce paramètre peut être l’une des valeurs d’énumération pour le TCP_CONNECTION_OFFLOAD_STATE défini dans l’en-tête Tcpmib.h .
Remarques
La fonction GetTcpTable2 récupère la table de connexion TCP IPv4 sur l’ordinateur local et retourne ces informations dans une structure MIB_TCPTABLE2 .
Un tableau de structures MIB_TCPROW2 est contenu dans la structure MIB_TCPTABLE2 .
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 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. 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.
Exemples
L’exemple suivant récupère la table de connexion TCP pour IPv4 et imprime l’état de chaque connexion représentée sous la forme d’une structure 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;
}
Configuration requise
Client minimal pris en charge | Windows Vista [applications de bureau uniquement] |
Serveur minimal pris en charge | Windows Server 2008 [applications de bureau uniquement] |
En-tête | tcpmib.h (inclure Iphlpapi.h) |