estructura de MIB_TCPROW_LH (tcpmib.h)
La estructura MIB_TCPROW contiene información que descibe una conexión TCP IPv4.
Sintaxis
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;
Miembros
dwState
Tipo: DWORD
Estado de la conexión TCP. Este miembro puede ser uno de los valores definidos en el archivo de encabezado Iprtrmib.h .
En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de archivos de encabezado ha cambiado. Este miembro puede ser uno de los valores de la enumeración MIB_TCP_STATE definida en el archivo de encabezado Tcpmib.h , no en el archivo de encabezado Iprtrmib.h . Tenga en cuenta que el archivo de encabezado Tcpmib.h se incluye automáticamente en Iprtrmib.h, que se incluye automáticamente en el archivo de encabezado Iphlpapi.h . Los archivos de encabezado Tcpmib.h e Iprtrmib.h nunca deben usarse directamente.
State
dwLocalAddr
Tipo: DWORD
Dirección IPv4 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.
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.
dwRemoteAddr
Tipo: DWORD
Dirección IPv4 de la conexión TCP en el equipo remoto. Cuando el miembro dwState es MIB_TCP_STATE_LISTEN, este valor no tiene 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 el miembro dwState es MIB_TCP_STATE_LISTEN, este miembro 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 función GetTcpTable recupera la tabla de conexión TCP IPv4 en el equipo local y devuelve esta información en una estructura de MIB_TCPTABLE .
Una matriz de estructuras de MIB_TCPROW se encuentra en la estructura MIB_TCPTABLE . La estructura MIB_TCPROW también la usa la función SetTcpEntry .
El miembro dwState 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 dwLocalAddr y dwRemoteAddr se almacenan como DWORD en el mismo formato que la estructura de in_addr . Para usar los miembros dwLocalAddr o dwRemoteAddr , es posible que se necesiten las funciones ntohl o inet_ntoa en Windows Sockets o funciones similares. En Windows Vista y versiones posteriores, las funciones RtlIpv4AddressToString o RtlIpv4AddressToStringEx se pueden usar para convertir la dirección IPv4 en los miembros dwLocalAddr o dwRemoteAddr en una cadena sin cargar el archivo DLL de Windows Sockets.
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.
La estructura MIB_TCPROW cambió ligeramente en Windows Vista y versiones posteriores. En Windows Vista y versiones posteriores, el miembro dwState se reemplaza por una unión que contiene los siguientes miembros.
En el Windows SDK, la versión de la estructura para su uso en Windows Vista y versiones posteriores se define como MIB_TCPROW_LH. En la Windows SDK, la versión de esta estructura que se usará en sistemas anteriores, incluidos Windows 2000 y versiones posteriores, se define como MIB_TCPROW_W2K. Al compilar una aplicación si la plataforma de destino es Windows Vista y versiones posteriores (NTDDI_VERSION >= NTDDI_LONGHORN
, _WIN32_WINNT >= 0x0600
o WINVER >= 0x0600
), la estructura MIB_TCPROW_LH se escribe en la estructura MIB_TCPROW . Al compilar una aplicación si la plataforma de destino no es Windows Vista y versiones posteriores, la estructura de MIB_TCPROW_W2K se escribe en la estructura MIB_TCPROW .
En el Windows SDK publicado para Windows Vista y versiones posteriores, la organización de archivos de encabezado ha cambiado. Esta estructura se define en el archivo de encabezado Tcpmib.h , no en el archivo de encabezado Iprtrmib.h . Tenga en cuenta que el archivo de encabezado Tcpmib.h se incluye automáticamente en Iprtrmib.h, que se incluye automáticamente en el archivo de encabezado Iphlpapi.h . Los archivos de encabezado Tcpmib.h e Iprtrmib.h nunca se deben usar directamente.
Ejemplos
En el ejemplo siguiente se recupera la tabla de conexión TCP y se imprime el estado de cada conexión representada como una estructura 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;
}
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 2000 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows 2000 Server [solo aplicaciones de escritorio] |
Encabezado | tcpmib.h (incluya Iphlpapi.h) |
Consulte también
MIB_TCP6ROW2