Bagikan melalui


Fungsi GetIpAddrTable (iphlpapi.h)

Fungsi GetIpAddrTable mengambil tabel pemetaan alamat antarmuka–ke–IPv4.

Sintaks

IPHLPAPI_DLL_LINKAGE DWORD GetIpAddrTable(
  [out]     PMIB_IPADDRTABLE pIpAddrTable,
  [in, out] PULONG           pdwSize,
  [in]      BOOL             bOrder
);

Parameter

[out] pIpAddrTable

Penunjuk ke buffer yang menerima tabel pemetaan alamat antarmuka–ke-IPv4 sebagai struktur MIB_IPADDRTABLE .

[in, out] pdwSize

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

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

[in] bOrder

Jika parameter ini TRUE, maka tabel pemetaan yang dikembalikan diurutkan dalam urutan naik menurut alamat IPv4. Pengurutan dilakukan dalam urutan byte jaringan. Misalnya, 10.0.0.255 datang segera sebelum 10.0.1.0.

Nilai kembali

Jika fungsi berhasil, nilai yang dikembalikan adalah NO_ERROR.

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

Menampilkan kode Deskripsi
ERROR_INSUFFICIENT_BUFFER
Buffer yang diacu oleh parameter pIpAddrTable tidak cukup besar. Ukuran yang diperlukan dikembalikan dalam variabel DWORD yang diarahkan oleh parameter pdwSize .
ERROR_INVALID_PARAMETER
Parameter pdwSize adalah NULL, atau GetIpAddrTable 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 FormatMessage untuk mendapatkan string pesan untuk kesalahan yang dikembalikan.

Keterangan

Fungsi GetIpAddrTable mengambil tabel pemetaan alamat antarmuka–ke–IPv4 di komputer lokal dan mengembalikan informasi ini dalam struktur MIB_IPADDRTABLE .

Alamat IPv4 yang dikembalikan oleh fungsi GetIpAddrTable dipengaruhi oleh status antarmuka jaringan di komputer lokal. Mengatur ulang kartu antarmuka jaringan (NIC) secara manual dan peristiwa PnP tertentu dapat mengakibatkan alamat IP dihapus atau diubah.

Pada Windows Server 2003 dan Windows XP, alamat IPv4 yang dikembalikan oleh fungsi GetIpAddrTable juga terpengaruh jika kemampuan penginderaan media tumpukan TCP/IP pada komputer lokal telah dinonaktifkan dengan memanggil fungsi DisableMediaSense . Ketika sensor media telah dinonaktifkan, fungsi GetIpAddrTable dapat mengembalikan alamat IPv4 yang terkait dengan antarmuka yang terputus. Alamat Ipv4 ini untuk antarmuka yang terputus tidak valid untuk digunakan.

Pada Windows Server 2008 dan Windows Vista, alamat IPv4 yang dikembalikan oleh fungsi GetIpAddrTable tidak terpengaruh oleh kemampuan penginderaan media tumpukan TCP/IP pada komputer lokal. Fungsi GetIpAddrTable hanya mengembalikan alamat IPv4 yang valid.

Fungsi GetAdaptersAddresses yang tersedia di Windows XP dapat digunakan untuk mengambil alamat IPv6 dan IPv4 dan informasi antarmuka.

Struktur MIB_IPADDRTABLE yang dikembalikan oleh fungsi GetIpAddrTable mungkin berisi pengisi untuk perataan antara anggota dwNumEntries dan entri array MIB_IPADDRROW pertama di anggota tabel . Padding untuk perataan mungkin juga ada di antara entri array MIB_IPADDRROW di anggota tabel . Setiap akses ke entri array MIB_IPADDRROW harus mengasumsikan padding mungkin ada.

Pada Kit Pengembangan Perangkat Lunak (SDK) Microsoft Windows yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah dan MIB_IPADDRROW didefinisikan dalam file header Ipmib.h yang tidak ada dalam file header Iprtrmib.h . Perhatikan bahwa file header Ipmib.h secara otomatis disertakan dalam Iprtrmib.h yang secara otomatis disertakan dalam file header Iphlpapi.h . File header Ipmib.h dan Iprtrmib.h tidak boleh digunakan secara langsung.

Contoh

Contoh berikut mengambil tabel alamat IP, lalu mencetak beberapa anggota entri alamat IP dalam tabel.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iphlpapi.h>
#include <stdio.h>

#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 __cdecl main()
{

    int i;
    
    /* Variables used by GetIpAddrTable */
    PMIB_IPADDRTABLE pIPAddrTable;
    DWORD dwSize = 0;
    DWORD dwRetVal = 0;
    IN_ADDR IPAddr;

    /* Variables used to return error message */
    LPVOID lpMsgBuf;

    // Before calling AddIPAddress we use GetIpAddrTable to get
    // an adapter to which we can add the IP.
    pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(sizeof (MIB_IPADDRTABLE));

    if (pIPAddrTable) {
        // Make an initial call to GetIpAddrTable to get the
        // necessary size into the dwSize variable
        if (GetIpAddrTable(pIPAddrTable, &dwSize, 0) ==
            ERROR_INSUFFICIENT_BUFFER) {
            FREE(pIPAddrTable);
            pIPAddrTable = (MIB_IPADDRTABLE *) MALLOC(dwSize);

        }
        if (pIPAddrTable == NULL) {
            printf("Memory allocation failed for GetIpAddrTable\n");
            exit(1);
        }
    }
    // Make a second call to GetIpAddrTable to get the
    // actual data we want
    if ( (dwRetVal = GetIpAddrTable( pIPAddrTable, &dwSize, 0 )) != NO_ERROR ) { 
        printf("GetIpAddrTable failed with error %d\n", dwRetVal);
        if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),       // Default language
                          (LPTSTR) & lpMsgBuf, 0, NULL)) {
            printf("\tError: %s", lpMsgBuf);
            LocalFree(lpMsgBuf);
        }
        exit(1);
    }

    printf("\tNum Entries: %ld\n", pIPAddrTable->dwNumEntries);
    for (i=0; i < (int) pIPAddrTable->dwNumEntries; i++) {
        printf("\n\tInterface Index[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwIndex);
        IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwAddr;
        printf("\tIP Address[%d]:     \t%s\n", i, inet_ntoa(IPAddr) );
        IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwMask;
        printf("\tSubnet Mask[%d]:    \t%s\n", i, inet_ntoa(IPAddr) );
        IPAddr.S_un.S_addr = (u_long) pIPAddrTable->table[i].dwBCastAddr;
        printf("\tBroadCast[%d]:      \t%s (%ld%)\n", i, inet_ntoa(IPAddr), pIPAddrTable->table[i].dwBCastAddr);
        printf("\tReassembly size[%d]:\t%ld\n", i, pIPAddrTable->table[i].dwReasmSize);
        printf("\tType and State[%d]:", i);
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_PRIMARY)
            printf("\tPrimary IP Address");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_DYNAMIC)
            printf("\tDynamic IP Address");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_DISCONNECTED)
            printf("\tAddress is on disconnected interface");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_DELETED)
            printf("\tAddress is being deleted");
        if (pIPAddrTable->table[i].wType & MIB_IPADDR_TRANSIENT)
            printf("\tTransient address");
        printf("\n");
    }

    if (pIPAddrTable) {
        FREE(pIPAddrTable);
        pIPAddrTable = NULL;
    }

    exit(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

AddIPAddress

DisableMediaSense

GetAdaptersAddresses

Referensi Fungsi Pembantu IP

IP_ADAPTER_ADDRESSES

MIB_IPADDRROW

MIB_IPADDRTABLE

RestoreMediaSense