Freigeben über


MIB_TCPROW2-Struktur (tcpmib.h)

Die MIB_TCPROW2-Struktur enthält Informationen, die eine IPv4-TCP-Verbindung beschreiben.

Syntax

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;

Member

dwState

Art: DWORD

Der Status der TCP-Verbindung. Dieser Member kann einer der Werte sein, die in der Headerdatei Iprtrmib.h definiert sind.

Im Windows SDK, das für Windows Vista und höher veröffentlicht wurde, wurde die organization von Headerdateien geändert. Dieser Member kann einer der Werte aus der MIB_TCP_STATE Enumeration sein, die in der Headerdatei "Tcpmib.h " und nicht in der Headerdatei "Iprtrmib.h " definiert ist. Beachten Sie, dass die Tcpmib.h-Headerdatei automatisch in Iprtrmib.h enthalten ist, die automatisch in der Headerdatei Iphlpapi.h enthalten ist. Die Headerdateien Tcpmib.h und Iprtrmib.h sollten nie direkt verwendet werden.

Wert Bedeutung
MIB_TCP_STATE_CLOSED
1
Die TCP-Verbindung befindet sich im Zustand CLOSED, der überhaupt keinen Verbindungszustand darstellt.
MIB_TCP_STATE_LISTEN
2
Die TCP-Verbindung befindet sich im LISTEN-Zustand und wartet auf eine Verbindungsanforderung von einem beliebigen Remote-TCP und -Port.
MIB_TCP_STATE_SYN_SENT
3
Die TCP-Verbindung befindet sich im SYN-SENT-Zustand und wartet auf eine übereinstimmende Verbindungsanforderung, nachdem eine Verbindungsanforderung (SYN-Paket) gesendet wurde.
MIB_TCP_STATE_SYN_RCVD
4
Die TCP-Verbindung befindet sich im ZUSTAND SYN-RECEIVED und wartet auf eine Bestätigung der Verbindungsanforderung, nachdem eine Verbindungsanforderung (SYN-Paket) empfangen und gesendet wurde.
MIB_TCP_STATE_ESTAB
5
Die TCP-Verbindung befindet sich im ZUSTAND ESTABLISHED, der eine offene Verbindung darstellt. Empfangene Daten können an den Benutzer übermittelt werden. Dies ist der Normalzustand für die Datenübertragungsphase der TCP-Verbindung.
MIB_TCP_STATE_FIN_WAIT1
6
Bei der TCP-Verbindung handelt es sich um einen FIN-WAIT-1-Zustand, der auf eine Verbindungsabschlussanforderung vom Remote-TCP oder eine Bestätigung der zuvor gesendeten Verbindungsabschlussanforderung wartet.
MIB_TCP_STATE_FIN_WAIT2
7
Die TCP-Verbindung ist FIN-WAIT-1-Zustand, der auf eine Verbindungsabschlussanforderung vom Remote-TCP wartet.
MIB_TCP_STATE_CLOSE_WAIT
8
Die TCP-Verbindung befindet sich im Zustand CLOSE-WAIT und wartet auf eine Verbindungsabbruchanforderung des lokalen Benutzers.
MIB_TCP_STATE_CLOSING
9
Die TCP-Verbindung befindet sich im Status CLOSING und wartet auf eine Bestätigung der Verbindungsabbruchanforderung vom Remote-TCP.
MIB_TCP_STATE_LAST_ACK
10
Die TCP-Verbindung befindet sich im Status LAST-ACK und wartet auf eine Bestätigung der Verbindungsabschlussanforderung, die zuvor an den Remote-TCP gesendet wurde (einschließlich einer Bestätigung der Verbindungsabschlussanforderung).
MIB_TCP_STATE_TIME_WAIT
11
Die TCP-Verbindung befindet sich im ZUSTAND TIME-WAIT und wartet darauf, dass genügend Zeit verstreichen kann, um sicherzustellen, dass das Remote-TCP die Bestätigung seiner Verbindungsabbruchanforderung erhalten hat.
MIB_TCP_STATE_DELETE_TCB
12
Die TCP-Verbindung befindet sich im TCB-Zustand delete, der das Löschen des Transmission Control Block (TCB) darstellt, einer Datenstruktur, die zum Verwalten von Informationen zu den einzelnen TCP-Einträgen verwendet wird.

dwLocalAddr

Art: DWORD

Die lokale IPv4-Adresse für die TCP-Verbindung auf dem lokalen Computer. Der Wert 0 gibt an, dass der Listener eine Verbindung auf einer beliebigen Schnittstelle akzeptieren kann.

dwLocalPort

Art: DWORD

Die lokale Portnummer in Netzwerkbytereihenfolge für die TCP-Verbindung auf dem lokalen Computer.

Die maximale Größe einer IP-Portnummer beträgt 16 Bit, daher sollten nur die unteren 16 Bits verwendet werden. Die oberen 16 Bits können nicht initialisierte Daten enthalten.

dwRemoteAddr

Art: DWORD

Die IPv4-Adresse für die TCP-Verbindung auf dem Remotecomputer. Wenn der dwState-MemberMIB_TCP_STATE_LISTEN ist, hat dieser Wert keine Bedeutung.

dwRemotePort

Art: DWORD

Die Remoteportnummer in Netzwerkbytereihenfolge für die TCP-Verbindung auf dem Remotecomputer. Wenn das dwState-ElementMIB_TCP_STATE_LISTEN ist, hat dieses Element keine Bedeutung.

Die maximale Größe einer IP-Portnummer beträgt 16 Bit, daher sollten nur die unteren 16 Bits verwendet werden. Die oberen 16 Bits können nicht initialisierte Daten enthalten.

dwOwningPid

Art: DWORD

Die PID des Prozesses, der eine Kontextbindung für diese TCP-Verbindung ausgestellt hat.

dwOffloadState

Typ: TCP_CONNECTION_OFFLOAD_STATE

Der Auslagerungsstatus für diese TCP-Verbindung. Dieser Parameter kann einer der Enumerationswerte für den im Tcpmib.h-Header definierten TCP_CONNECTION_OFFLOAD_STATE sein.

Hinweise

Die GetTcpTable2-Funktion ruft die IPv4-TCP-Verbindungstabelle auf dem lokalen Computer ab und gibt diese Informationen in einer MIB_TCPTABLE2 Struktur zurück.

Ein Array von MIB_TCPROW2 Strukturen ist in der MIB_TCPTABLE2-Struktur enthalten.

Das dwState-Element gibt den Status des TCP-Eintrags in einem TCP-Zustandsdiagramm an. Eine TCP-Verbindung durchläuft während ihrer Lebensdauer eine Reihe von Zuständen. Die Zustände sind: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT und der fiktive Status GESCHLOSSEN. Der ZUSTAND CLOSED ist fiktional, da er den Zustand darstellt, wenn kein Übertragungssteuerungsblock und daher keine Verbindung vorhanden ist. Das TCP-Protokoll wird in RFC 793 beschrieben. Weitere Informationen finden Sie unter http://www.ietf.org/rfc/rfc793.txt.

Die Mitglieder dwLocalPort und dwRemotePort befinden sich in der Reihenfolge des Netzwerkbytes. Um die dwLocalPort - oder dwRemotePort-Member verwenden zu können, sind möglicherweise die Funktionen ntohs oder inet_ntoa in Windows Sockets oder ähnlichen Funktionen erforderlich. Die Elemente dwLocalAddr und dwRemoteAddr werden als DWORD im gleichen Format wie die in_addr-Struktur gespeichert. Um die dwLocalAddr - oder dwRemoteAddr-Member verwenden zu können, sind möglicherweise die Funktionen ntohl oder inet_ntoa in Windows Sockets oder ähnlichen Funktionen erforderlich. Unter Windows Vista und höher können die Funktionen RtlIpv4AddressToString oder RtlIpv4AddressToStringEx verwendet werden, um die IPv4-Adresse in den Elementen dwLocalAddr oder dwRemoteAddr in eine Zeichenfolge zu konvertieren, ohne die Windows Sockets-DLL zu laden.

Beispiele

Im folgenden Beispiel wird die TCP-Verbindungstabelle für IPv4 abgerufen und der Zustand jeder Verbindung ausgegeben, die als MIB_TCPROW2 Struktur dargestellt wird.

#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;    
}

Anforderungen

   
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Kopfzeile tcpmib.h (include Iphlpapi.h)

Weitere Informationen

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