Bagikan melalui


Fungsi GetIfTable (iphlpapi.h)

Fungsi GetIfTable mengambil tabel antarmuka MIB-II.

Sintaks

IPHLPAPI_DLL_LINKAGE DWORD GetIfTable(
  [out]     PMIB_IFTABLE pIfTable,
  [in, out] PULONG       pdwSize,
  [in]      BOOL         bOrder
);

Parameter

[out] pIfTable

Penunjuk ke buffer yang menerima tabel antarmuka sebagai struktur MIB_IFTABLE .

[in, out] pdwSize

Pada input, menentukan ukuran dalam byte buffer yang diacu oleh parameter pIfTable .

Pada output, jika buffer tidak cukup besar untuk menahan tabel antarmuka yang dikembalikan, fungsi mengatur parameter ini sama dengan ukuran buffer yang diperlukan dalam byte.

[in] bOrder

Nilai Boolean yang menentukan apakah tabel antarmuka yang dikembalikan harus diurutkan dalam urutan naik menurut indeks antarmuka. Jika parameter ini TRUE, tabel akan diurutkan.

Mengembalikan nilai

Jika fungsi berhasil, nilai yang dikembalikan NO_ERROR.

Jika fungsi gagal, nilai yang dikembalikan adalah salah satu kode kesalahan berikut.

Menampilkan kode Deskripsi
ERROR_INSUFFICIENT_BUFFER
Buffer yang ditujukkan oleh parameter pIfTable tidak cukup besar. Ukuran yang diperlukan dikembalikan dalam variabel DWORD yang diarahkan oleh parameter pdwSize .
ERROR_INVALID_PARAMETER
Parameter pdwSizeadalah NULL, atau GetIfTable tidak dapat menulis ke memori yang diarahkan oleh parameter pdwSize .
ERROR_NOT_SUPPORTED
Fungsi ini tidak didukung pada sistem operasi yang digunakan pada sistem lokal.
Lainnya
Gunakan fungsi FormatMessage untuk mendapatkan string pesan untuk kesalahan yang dikembalikan.

Keterangan

The
Fungsi GetIfTable menghitung antarmuka fisik pada sistem lokal dan mengembalikan informasi ini dalam struktur MIB_IFTABLE . Antarmuka fisik mencakup antarmuka loopback perangkat lunak.

Fungsi GetIfTable2 dan GetIfTable2Ex yang tersedia di Windows Vista dan yang lebih baru adalah versi fungsi GetIfTable yang disempurnakan yang menghitung antarmuka fisik dan logis pada sistem lokal. Antarmuka logis mencakup berbagai antarmuka WAN Miniport yang digunakan untuk L2TP, PPTP, PPOE, dan enkapulasi terowongan lainnya.

Antarmuka dikembalikan dalam struktur MIB_IFTABLE dalam buffer yang diacu oleh parameter pIfTable . Struktur MIB_IFTABLE berisi jumlah antarmuka dan array struktur MIB_IFROW untuk setiap antarmuka.

Perhatikan bahwa struktur MIB_IFTABLE yang dikembalikan yang diarahkan oleh parameter pIfTable mungkin berisi padding untuk perataan antara anggota dwNumEntries dan entri array MIB_IFROW pertama dalam anggota tabel struktur MIB_IFTABLE . Padding untuk perataan mungkin juga ada di antara entri array MIB_IFROW . Akses apa pun ke entri array MIB_IFROW harus mengasumsikan padding mungkin ada.

Contoh

Contoh berikut mengambil tabel antarmuka dan mencetak jumlah entri dalam tabel dan beberapa data pada setiap entri.

#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib, "IPHLPAPI.lib")

#include <iphlpapi.h>

#include <stdio.h>
#include <stdlib.h>

#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.

    DWORD dwSize = 0;
    DWORD dwRetVal = 0;

    unsigned int i, j;

    /* variables used for GetIfTable and GetIfEntry */
    MIB_IFTABLE *pIfTable;
    MIB_IFROW *pIfRow;

    // Allocate memory for our pointers.
    pIfTable = (MIB_IFTABLE *) MALLOC(sizeof (MIB_IFTABLE));
    if (pIfTable == NULL) {
        printf("Error allocating memory needed to call GetIfTable\n");
        return 1;
    }
    // Make an initial call to GetIfTable to get the
    // necessary size into dwSize
    dwSize = sizeof (MIB_IFTABLE);
    if (GetIfTable(pIfTable, &dwSize, FALSE) == ERROR_INSUFFICIENT_BUFFER) {
        FREE(pIfTable);
        pIfTable = (MIB_IFTABLE *) MALLOC(dwSize);
        if (pIfTable == NULL) {
            printf("Error allocating memory needed to call GetIfTable\n");
            return 1;
        }
    }
    // Make a second call to GetIfTable to get the actual
    // data we want.
    if ((dwRetVal = GetIfTable(pIfTable, &dwSize, FALSE)) == NO_ERROR) {
        printf("\tNum Entries: %ld\n\n", pIfTable->dwNumEntries);
        for (i = 0; i < pIfTable->dwNumEntries; i++) {
            pIfRow = (MIB_IFROW *) & pIfTable->table[i];
            printf("\tIndex[%d]:\t %ld\n", i, pIfRow->dwIndex);
            printf("\tInterfaceName[%d]:\t %ws", i, pIfRow->wszName);
            printf("\n");
            printf("\tDescription[%d]:\t ", i);
            for (j = 0; j < pIfRow->dwDescrLen; j++)
                printf("%c", pIfRow->bDescr[j]);
            printf("\n");
            printf("\tType[%d]:\t ", i);
            switch (pIfRow->dwType) {
            case IF_TYPE_OTHER:
                printf("Other\n");
                break;
            case IF_TYPE_ETHERNET_CSMACD:
                printf("Ethernet\n");
                break;
            case IF_TYPE_ISO88025_TOKENRING:
                printf("Token Ring\n");
                break;
            case IF_TYPE_PPP:
                printf("PPP\n");
                break;
            case IF_TYPE_SOFTWARE_LOOPBACK:
                printf("Software Lookback\n");
                break;
            case IF_TYPE_ATM:
                printf("ATM\n");
                break;
            case IF_TYPE_IEEE80211:
                printf("IEEE 802.11 Wireless\n");
                break;
            case IF_TYPE_TUNNEL:
                printf("Tunnel type encapsulation\n");
                break;
            case IF_TYPE_IEEE1394:
                printf("IEEE 1394 Firewire\n");
                break;
            default:
                printf("Unknown type %ld\n", pIfRow->dwType);
                break;
            }
            printf("\tMtu[%d]:\t\t %ld\n", i, pIfRow->dwMtu);
            printf("\tSpeed[%d]:\t %ld\n", i, pIfRow->dwSpeed);
            printf("\tPhysical Addr:\t ");
            if (pIfRow->dwPhysAddrLen == 0)
                printf("\n");
            for (j = 0; j < pIfRow->dwPhysAddrLen; j++) {
                if (j == (pIfRow->dwPhysAddrLen - 1))
                    printf("%.2X\n", (int) pIfRow->bPhysAddr[j]);
                else
                    printf("%.2X-", (int) pIfRow->bPhysAddr[j]);
            }
            printf("\tAdmin Status[%d]:\t %ld\n", i, pIfRow->dwAdminStatus);
            printf("\tOper Status[%d]:\t ", i);
            switch (pIfRow->dwOperStatus) {
            case IF_OPER_STATUS_NON_OPERATIONAL:
                printf("Non Operational\n");
                break;
            case IF_OPER_STATUS_UNREACHABLE:
                printf("Unreachable\n");
                break;
            case IF_OPER_STATUS_DISCONNECTED:
                printf("Disconnected\n");
                break;
            case IF_OPER_STATUS_CONNECTING:
                printf("Connecting\n");
                break;
            case IF_OPER_STATUS_CONNECTED:
                printf("Connected\n");
                break;
            case IF_OPER_STATUS_OPERATIONAL:
                printf("Operational\n");
                break;
            default:
                printf("Unknown status %ld\n", pIfRow->dwAdminStatus);
                break;
            }
            printf("\n");
        }
    } else {
        printf("GetIfTable failed with error: \n", dwRetVal);
        if (pIfTable != NULL) {
            FREE(pIfTable);
            pIfTable = NULL;
        }  
        return 1;
        // Here you can use FormatMessage to find out why 
        // it failed.
    }
    if (pIfTable != NULL) {
        FREE(pIfTable);
        pIfTable = NULL;
    }
    return 0;
}


Persyaratan

   
Klien minimum yang didukung Windows 2000 Professional [hanya aplikasi desktop]
Server minimum yang didukung Windows 2000 Server [hanya aplikasi desktop]
Target Platform Windows
Header iphlpapi.h
Pustaka Iphlpapi.lib
DLL Iphlpapi.dll

Lihat juga

GetIfEntry

GetIfEntry2

GetIfTable2

GetIfTable2Ex

GetNumberOfInterfaces

Referensi Fungsi Pembantu IP

MIB_IFROW

MIB_IFTABLE

MIB_IF_ROW2

MIB_IF_TABLE2