struktur MIB_TCPROW2 (tcpmib.h)

Struktur MIB_TCPROW2 berisi informasi yang menjelaskan koneksi IPv4 TCP.

Sintaks

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;

Anggota

dwState

Jenis: DWORD

Status koneksi TCP. Anggota ini dapat menjadi salah satu nilai yang ditentukan dalam file header Iprtrmib.h .

Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah. Anggota ini dapat menjadi salah satu nilai dari enumerasi MIB_TCP_STATE yang ditentukan dalam file header Tcpmib.h , bukan dalam file header Iprtrmib.h . Perhatikan bahwa file header Tcpmib.h secara otomatis disertakan dalam Iprtrmib.h, yang secara otomatis disertakan dalam file header Iphlpapi.h . File header Tcpmib.h dan Iprtrmib.h tidak boleh digunakan secara langsung.

Nilai Makna
MIB_TCP_STATE_CLOSED
1
Koneksi TCP berada dalam status TERTUTUP yang tidak mewakili status koneksi sama sekali.
MIB_TCP_STATE_LISTEN
2
Koneksi TCP berada dalam status LISTEN menunggu permintaan koneksi dari TCP dan port jarak jauh.
MIB_TCP_STATE_SYN_SENT
3
Koneksi TCP berada dalam status SYN-SENT menunggu permintaan koneksi yang cocok setelah mengirim permintaan koneksi (paket SYN).
MIB_TCP_STATE_SYN_RCVD
4
Koneksi TCP berada dalam status SYN-RECEIVED menunggu pengakuan permintaan koneksi yang mengonfirmasi setelah menerima dan mengirim permintaan koneksi (paket SYN).
MIB_TCP_STATE_ESTAB
5
Koneksi TCP berada dalam status ESTABLISHED yang mewakili koneksi terbuka, data yang diterima dapat dikirimkan kepada pengguna. Ini adalah status normal untuk fase transfer data koneksi TCP.
MIB_TCP_STATE_FIN_WAIT1
6
Koneksi TCP adalah status FIN-WAIT-1 menunggu permintaan penghentian koneksi dari TCP jarak jauh, atau pengakuan permintaan penghentian koneksi yang sebelumnya dikirim.
MIB_TCP_STATE_FIN_WAIT2
7
Koneksi TCP adalah status FIN-WAIT-1 menunggu permintaan penghentian koneksi dari TCP jarak jauh.
MIB_TCP_STATE_CLOSE_WAIT
8
Koneksi TCP berada dalam status CLOSE-WAIT menunggu permintaan penghentian koneksi dari pengguna lokal.
MIB_TCP_STATE_CLOSING
9
Koneksi TCP berada dalam status CLOSING menunggu pengakuan permintaan penghentian koneksi dari TCP jarak jauh.
MIB_TCP_STATE_LAST_ACK
10
Koneksi TCP berada dalam status LAST-ACK menunggu pengakuan permintaan penghentian koneksi yang sebelumnya dikirim ke TCP jarak jauh (yang mencakup pengakuan permintaan penghentian koneksinya).
MIB_TCP_STATE_TIME_WAIT
11
Koneksi TCP berada dalam status TIME-WAIT menunggu cukup waktu untuk lulus untuk memastikan TCP jarak jauh menerima pengakuan permintaan penghentian koneksinya.
MIB_TCP_STATE_DELETE_TCB
12
Koneksi TCP berada dalam status hapus TCB yang mewakili penghapusan Blok Kendali Transmisi (TCB), struktur data yang digunakan untuk mempertahankan informasi pada setiap entri TCP.

dwLocalAddr

Jenis: DWORD

Alamat IPv4 lokal untuk koneksi TCP pada komputer lokal. Nilai nol menunjukkan pendengar dapat menerima koneksi pada antarmuka apa pun.

dwLocalPort

Jenis: DWORD

Nomor port lokal dalam urutan byte jaringan untuk koneksi TCP pada komputer lokal.

Ukuran maksimum nomor port IP adalah 16 bit, jadi hanya 16 bit yang lebih rendah yang harus digunakan. 16 bit atas mungkin berisi data yang tidak diinisialisasi.

dwRemoteAddr

Jenis: DWORD

Alamat IPv4 untuk koneksi TCP pada komputer jarak jauh. Ketika anggota dwStateMIB_TCP_STATE_LISTEN, nilai ini tidak memiliki arti.

dwRemotePort

Jenis: DWORD

Nomor port jarak jauh dalam urutan byte jaringan untuk koneksi TCP pada komputer jarak jauh. Ketika anggota dwStateMIB_TCP_STATE_LISTEN, anggota ini tidak memiliki arti.

Ukuran maksimum nomor port IP adalah 16 bit, jadi hanya 16 bit yang lebih rendah yang harus digunakan. 16 bit atas mungkin berisi data yang tidak diinisialisasi.

dwOwningPid

Jenis: DWORD

PID proses yang mengeluarkan konteks yang mengikat untuk koneksi TCP ini.

dwOffloadState

Jenis: TCP_CONNECTION_OFFLOAD_STATE

Status offload untuk koneksi TCP ini. Parameter ini dapat menjadi salah satu nilai enumerasi untuk TCP_CONNECTION_OFFLOAD_STATE yang ditentukan dalam header Tcpmib.h .

Keterangan

Fungsi GetTcpTable2 mengambil tabel koneksi IPv4 TCP di komputer lokal dan mengembalikan informasi ini dalam struktur MIB_TCPTABLE2 .

Array struktur MIB_TCPROW2 terkandung dalam struktur MIB_TCPTABLE2 .

Anggota dwState menunjukkan status entri TCP dalam diagram status TCP. Koneksi TCP berkembang melalui serangkaian status selama masa pakainya. Statusnya adalah: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT, dan status fiktif CLOSED. Status CLOSED bersifat fiktif karena mewakili status ketika tidak ada Blok Kontrol Transmisi, dan oleh karena itu, tidak ada koneksi. Protokol TCP dijelaskan dalam RFC 793. Untuk informasi selengkapnya, lihat http://www.ietf.org/rfc/rfc793.txt.

Anggota dwLocalPort, dan dwRemotePort berada dalam urutan byte jaringan. Untuk menggunakan anggota dwLocalPort atau dwRemotePort , fungsi ntohs atau inet_ntoa di Windows Sockets atau fungsi serupa mungkin diperlukan. Anggota dwLocalAddr dan dwRemoteAddr disimpan sebagai DWORD dalam format yang sama dengan struktur in_addr . Untuk menggunakan anggota dwLocalAddr atau dwRemoteAddr , fungsi ntohl atau inet_ntoa di Windows Sockets atau fungsi serupa mungkin diperlukan. Pada Windows Vista dan yang lebih baru, fungsi RtlIpv4AddressToString atau RtlIpv4AddressToStringEx dapat digunakan untuk mengonversi alamat IPv4 di anggota dwLocalAddr atau dwRemoteAddr ke string tanpa memuat DLL Soket Windows.

Contoh

Contoh berikut mengambil tabel koneksi TCP untuk IPv4 dan mencetak status setiap koneksi yang direpresentasikan sebagai struktur 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;    
}

Persyaratan

   
Klien minimum yang didukung Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 [hanya aplikasi desktop]
Header tcpmib.h (termasuk Iphlpapi.h)

Lihat juga

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