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 |
---|---|
|
Buffer yang ditujukkan oleh parameter pIfTable tidak cukup besar. Ukuran yang diperlukan dikembalikan dalam variabel DWORD yang diarahkan oleh parameter pdwSize . |
|
Parameter pdwSizeadalah NULL, atau GetIfTable tidak dapat menulis ke memori yang diarahkan oleh parameter pdwSize . |
|
Fungsi ini tidak didukung pada sistem operasi yang digunakan pada sistem lokal. |
|
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 |