structure MIB_TCP6ROW (tcpmib.h)
La structure MIB_TCP6ROW contient des informations qui décrivent une connexion TCP IPv6.
typedef struct _MIB_TCP6ROW {
MIB_TCP_STATE State;
IN6_ADDR LocalAddr;
DWORD dwLocalScopeId;
DWORD dwLocalPort;
IN6_ADDR RemoteAddr;
DWORD dwRemoteScopeId;
DWORD dwRemotePort;
} MIB_TCP6ROW, *PMIB_TCP6ROW;
State
Type : 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 .
LocalAddr
Type : IN6_ADDR
Adresse IPv6 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.
dwLocalScopeId
Type : DWORD
ID d’étendue locale de la connexion TCP sur l’ordinateur local.
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.
RemoteAddr
Type : IN6_ADDR
Adresse IPv6 de la connexion TCP sur l’ordinateur distant. Lorsque le membre de l’Étatest MIB_TCP_STATE_LISTEN, cette valeur n’a aucune signification.
dwRemoteScopeId
Type : DWORD
ID d’étendue distante de la connexion TCP sur l’ordinateur distant. Lorsque le membre de l’Étatest 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 de l’Étatest MIB_TCP_STATE_LISTEN, cette valeur 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.
La structure MIB_TCP6ROW est définie sur Windows Vista et versions ultérieures.
La fonction GetTcp6Table récupère la table de connexion TCP IPv6 sur l’ordinateur local et retourne ces informations dans une structure MIB_TCP6TABLE .
Un tableau de structures MIB_TCP6ROW est contenu dans la structure MIB_TCP6TABLE .
Le membre State 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 dwLocalScopeId et dwRemoteScopeId sont dans l’ordre d’octet réseau. Pour utiliser les membres dwLocalScopeId ou dwRemoteScopeId , les fonctions ntohl ou inet_ntoa dans les sockets Windows ou des fonctions similaires peuvent être nécessaires.
Les membres LocalAddr et RemoteAddr sont stockés dans in6_addr structures. Les fonctions RtlIpv6AddressToString ou RtlIpv6AddressToStringEx peuvent être utilisées pour convertir l’adresse IPv6 dans les membres LocalAddr ou RemoteAddr en chaîne sans charger la DLL des sockets Windows.
L’exemple suivant récupère la table de connexion TCP pour IPv6 et imprime l’état de chaque connexion représentée sous la forme d’une structure MIB_TCP6ROW .
#define UNICODE 1
#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 wmain()
{
// Declare and initialize variables
PMIB_TCP6TABLE pTcpTable;
DWORD dwSize = 0;
DWORD dwRetVal = 0;
wchar_t ipstringbuffer[46];
int i;
pTcpTable = (MIB_TCP6TABLE *) MALLOC(sizeof (MIB_TCP6TABLE));
if (pTcpTable == NULL) {
wprintf(L"Error allocating memory\n");
return 1;
}
dwSize = sizeof (MIB_TCP6TABLE);
// Make an initial call to GetTcp6Table to
// get the necessary size into the dwSize variable
if ((dwRetVal = GetTcp6Table(pTcpTable, &dwSize, TRUE)) ==
ERROR_INSUFFICIENT_BUFFER) {
FREE(pTcpTable);
pTcpTable = (MIB_TCP6TABLE *) MALLOC(dwSize);
if (pTcpTable == NULL) {
wprintf(L"Error allocating memory\n");
return 1;
}
}
// Make a second call to GetTcp6Table to get
// the actual data we require
if ((dwRetVal = GetTcp6Table(pTcpTable, &dwSize, TRUE)) == NO_ERROR) {
wprintf(L"\tNumber of entries: %d\n", (int) pTcpTable->dwNumEntries);
for (i = 0; i < (int) pTcpTable->dwNumEntries; i++) {
wprintf(L"\n\tTCP[%d] State: %ld - ", i,
pTcpTable->table[i].State);
switch (pTcpTable->table[i].State) {
case MIB_TCP_STATE_CLOSED:
wprintf(L"CLOSED\n");
break;
case MIB_TCP_STATE_LISTEN:
wprintf(L"LISTEN\n");
break;
case MIB_TCP_STATE_SYN_SENT:
wprintf(L"SYN-SENT\n");
break;
case MIB_TCP_STATE_SYN_RCVD:
wprintf(L"SYN-RECEIVED\n");
break;
case MIB_TCP_STATE_ESTAB:
wprintf(L"ESTABLISHED\n");
break;
case MIB_TCP_STATE_FIN_WAIT1:
wprintf(L"FIN-WAIT-1\n");
break;
case MIB_TCP_STATE_FIN_WAIT2:
wprintf(L"FIN-WAIT-2 \n");
break;
case MIB_TCP_STATE_CLOSE_WAIT:
wprintf(L"CLOSE-WAIT\n");
break;
case MIB_TCP_STATE_CLOSING:
wprintf(L"CLOSING\n");
break;
case MIB_TCP_STATE_LAST_ACK:
wprintf(L"LAST-ACK\n");
break;
case MIB_TCP_STATE_TIME_WAIT:
wprintf(L"TIME-WAIT\n");
break;
case MIB_TCP_STATE_DELETE_TCB:
wprintf(L"DELETE-TCB\n");
break;
default:
wprintf(L"UNKNOWN dwState value\n");
break;
}
if (InetNtop(AF_INET6, &pTcpTable->table[i].LocalAddr, ipstringbuffer, 46) == NULL)
wprintf(L" InetNtop function failed for local IPv6 address\n");
else
wprintf(L"\tTCP[%d] Local Addr: %s\n", i, ipstringbuffer);
wprintf(L"\tTCP[%d] Local Scope ID: %d \n", i,
ntohl (pTcpTable->table[i].dwLocalScopeId));
wprintf(L"\tTCP[%d] Local Port: %d \n", i,
ntohs((u_short)pTcpTable->table[i].dwLocalPort));
if (InetNtop(AF_INET6, &pTcpTable->table[i].RemoteAddr, ipstringbuffer, 46) == NULL)
wprintf(L" InetNtop function failed for remote IPv6 address\n");
else
wprintf(L"\tTCP[%d] Remote Addr: %s\n", i, ipstringbuffer);
wprintf(L"\tTCP[%d] Remote Scope ID: %d \n", i,
ntohl(pTcpTable->table[i].dwRemoteScopeId));
wprintf(L"\tTCP[%d] Remote Port: %d\n", i,
ntohs((u_short)pTcpTable->table[i].dwRemotePort));
}
} else {
wprintf(L"\tGetTcp6Table failed with %d\n", dwRetVal);
FREE(pTcpTable);
return 1;
}
if (pTcpTable != NULL) {
FREE(pTcpTable);
pTcpTable = NULL;
}
return 0;
}
Condition requise | Valeur |
---|---|
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) |