Compartir a través de


estructura MIB_TCPROW2 (tcpmib.h)

La estructura MIB_TCPROW2 contiene información que describe una conexión TCP IPv4.

Sintaxis

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;

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 Windows SDK publicado para Windows Vista y versiones posteriores, la organización de los 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 se deben usar directamente.

Valor Significado
MIB_TCP_STATE_CLOSED
1
La conexión TCP está en estado CLOSED que no representa ningún estado de conexión.
MIB_TCP_STATE_LISTEN
2
La conexión TCP está en estado LISTEN esperando una solicitud de conexión desde cualquier PUERTO y TCP remoto.
MIB_TCP_STATE_SYN_SENT
3
La conexión TCP está en estado SYN-SENT esperando una solicitud de conexión coincidente después de haber enviado una solicitud de conexión (paquete SYN).
MIB_TCP_STATE_SYN_RCVD
4
La conexión TCP está en estado SYN-RECEIVED esperando una confirmación de confirmación de solicitud de conexión después de haber recibido y enviado una solicitud de conexión (paquete SYN).
MIB_TCP_STATE_ESTAB
5
La conexión TCP está en el estado ESTABLISHED que representa una conexión abierta, los datos recibidos se pueden entregar al usuario. Este es el estado normal de la fase de transferencia de datos de la conexión TCP.
MIB_TCP_STATE_FIN_WAIT1
6
La conexión TCP es el estado FIN-WAIT-1 en espera de una solicitud de terminación de conexión desde el TCP remoto o una confirmación de la solicitud de terminación de conexión enviada anteriormente.
MIB_TCP_STATE_FIN_WAIT2
7
La conexión TCP es el estado FIN-WAIT-1 en espera de una solicitud de terminación de conexión desde el TCP remoto.
MIB_TCP_STATE_CLOSE_WAIT
8
La conexión TCP está en estado CLOSE-WAIT esperando una solicitud de terminación de conexión del usuario local.
MIB_TCP_STATE_CLOSING
9
La conexión TCP está en estado CLOSING esperando una confirmación de solicitud de terminación de conexión desde el TCP remoto.
MIB_TCP_STATE_LAST_ACK
10
La conexión TCP está en el estado LAST-ACK esperando una confirmación de la solicitud de terminación de conexión enviada previamente al TCP remoto (que incluye una confirmación de su solicitud de terminación de conexión).
MIB_TCP_STATE_TIME_WAIT
11
La conexión TCP está en el estado TIME-WAIT esperando suficiente tiempo para pasar para asegurarse de que el TCP remoto recibió la confirmación de su solicitud de terminación de conexión.
MIB_TCP_STATE_DELETE_TCB
12
La conexión TCP está en el estado de eliminación de TCB que representa la eliminación del bloque de control de transmisión (TCB), una estructura de datos que se usa para mantener información sobre cada entrada TCP.

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 sin inicializar.

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 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 el miembro dwState está 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 sin inicializar.

dwOwningPid

Tipo: DWORD

PiD del proceso que emitió un enlace de contexto para esta conexión TCP.

dwOffloadState

Tipo: TCP_CONNECTION_OFFLOAD_STATE

Estado de descarga de esta conexión TCP. Este parámetro puede ser uno de los valores de enumeración del TCP_CONNECTION_OFFLOAD_STATE definido en el encabezado Tcpmib.h .

Comentarios

La función GetTcpTable2 recupera la tabla de conexión TCP IPv4 en el equipo local y devuelve esta información en una estructura de MIB_TCPTABLE2 .

Una matriz de estructuras de MIB_TCPROW2 se encuentra en la estructura MIB_TCPTABLE2 .

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 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 , es posible que se necesiten las funciones ntohs o inet_ntoa en Windows Sockets o funciones similares. Los miembros dwLocalAddr y dwRemoteAddr se almacenan como DWORD en el mismo formato que la estructura 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.

Ejemplos

En el ejemplo siguiente se recupera la tabla de conexión TCP para IPv4 e imprime el estado de cada conexión representada como una estructura de 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;    
}

Requisitos

   
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)

Consulte también

GetTcp6Table

GetTcp6Table2

GetTcpTable

GetTcpTable2

MIB_TCP6ROW

MIB_TCP6ROW2

MIB_TCP6TABLE

MIB_TCP6TABLE2

MIB_TCPTABLE

MIB_TCPTABLE2

RtlIpv4AddressToString

RtlIpv4AddressToStringEx

SetTcpEntry

TCP_CONNECTION_OFFLOAD_STATE

in_addr

inet_ntoa

ntohl

ntohs