estructura MIB_TCP6ROW (tcpmib.h)
La estructura MIB_TCP6ROW contiene información que describe una conexión TCP IPv6.
Sintaxis
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;
Miembros
State
Tipo: MIB_TCP_STATE
Estado de la conexión TCP. Este miembro puede ser uno de los valores del tipo de enumeración MIB_TCP_STATE definido en el archivo de encabezado Tcpmib.h .
LocalAddr
Tipo: IN6_ADDR
Dirección IPv6 local para la conexión TCP en el equipo local. Un valor de cero indica que el agente de escucha puede aceptar una conexión en cualquier interfaz.
dwLocalScopeId
Tipo: DWORD
Identificador de ámbito local de la conexión TCP en el equipo local.
dwLocalPort
Tipo: DWORD
Número de puerto local en orden de bytes de red para la conexión TCP en el equipo local.
El tamaño máximo de un número de puerto IP es de 16 bits, por lo que solo se deben usar los 16 bits inferiores. Los 16 bits superiores pueden contener datos no inicializados.
RemoteAddr
Tipo: IN6_ADDR
Dirección IPv6 de la conexión TCP en el equipo remoto. Cuando se MIB_TCP_STATE_LISTEN el miembro del Estado, este valor no tiene ningún significado.
dwRemoteScopeId
Tipo: DWORD
Identificador de ámbito remoto para la conexión TCP en el equipo remoto. Cuando se MIB_TCP_STATE_LISTEN el miembro del Estado, este valor no tiene ningún significado.
dwRemotePort
Tipo: DWORD
Número de puerto remoto en orden de bytes de red para la conexión TCP en el equipo remoto. Cuando se MIB_TCP_STATE_LISTEN el miembro del Estado, este valor no tiene ningún significado.
El tamaño máximo de un número de puerto IP es de 16 bits, por lo que solo se deben usar los 16 bits inferiores. Los 16 bits superiores pueden contener datos no inicializados.
Comentarios
La estructura MIB_TCP6ROW se define en Windows Vista y versiones posteriores.
La función GetTcp6Table recupera la tabla de conexión TCP IPv6 en el equipo local y devuelve esta información en una estructura de MIB_TCP6TABLE .
Una matriz de estructuras de MIB_TCP6ROW se encuentra en la estructura MIB_TCP6TABLE .
El miembro State indica el estado de la entrada TCP en un diagrama de estado TCP. Una conexión TCP avanza a través de una serie de estados durante su vigencia. Los estados son: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT y el estado ficticio CLOSED. El estado CLOSED es ficticio porque representa el estado cuando no hay ningún bloque de control de transmisión y, por lo tanto, no hay ninguna conexión. El protocolo TCP se describe en RFC 793. Para obtener más información, vea http://www.ietf.org/rfc/rfc793.txt.
Los miembros dwLocalPort y dwRemotePort están en orden de bytes de red. Para usar los miembros dwLocalPort o dwRemotePort , pueden ser necesarias las funciones ntohs o inet_ntoa en Windows Sockets o funciones similares.
Los miembros dwLocalScopeId y dwRemoteScopeId están en orden de bytes de red. Para usar los miembros dwLocalScopeId o dwRemoteScopeId , pueden ser necesarias las funciones ntohl o inet_ntoa de Windows Sockets o funciones similares.
Los miembros LocalAddr y RemoteAddr se almacenan en estructuras in6_addr . Las funciones RtlIpv6AddressToString o RtlIpv6AddressToStringEx se pueden usar para convertir la dirección IPv6 en los miembros LocalAddr o RemoteAddr en una cadena sin cargar el archivo DLL de Windows Sockets.
Ejemplos
En el ejemplo siguiente se recupera la tabla de conexión TCP para IPv6 y se imprime el estado de cada conexión representada como una estructura de 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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows Vista [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 [solo aplicaciones de escritorio] |
Encabezado | tcpmib.h (incluya Iphlpapi.h) |