Bagikan melalui


Fungsi GetIpNetTable2 (netioapi.h)

Fungsi GetIpNetTable2 mengambil tabel tetangga IP di komputer lokal.

Sintaks

IPHLPAPI_DLL_LINKAGE _NETIOAPI_SUCCESS_ NETIOAPI_API GetIpNetTable2(
  [in]  ADDRESS_FAMILY    Family,
  [out] PMIB_IPNET_TABLE2 *Table
);

Parameter

[in] Family

Keluarga alamat yang akan diambil.

Nilai yang mungkin untuk keluarga alamat tercantum dalam file header Winsock2.h . Perhatikan bahwa nilai untuk keluarga alamat AF_ dan konstanta keluarga protokol PF_ identik (misalnya, AF_INET dan PF_INET), sehingga konstanta dapat digunakan.

Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah dan nilai yang mungkin untuk anggota ini ditentukan dalam file header Ws2def.h . Perhatikan bahwa file header Ws2def.h secara otomatis disertakan dalam Winsock2.h, dan tidak boleh digunakan secara langsung.

Nilai yang saat ini didukung adalah AF_INET, AF_INET6, dan AF_UNSPEC.

Nilai Makna
AF_UNSPEC
0
Keluarga alamat tidak ditentukan. Ketika parameter ini ditentukan, fungsi ini mengembalikan tabel alamat IP tetangga yang berisi entri IPv4 dan IPv6.
AF_INET
2
Keluarga alamat Protokol Internet versi 4 (IPv4). Ketika parameter ini ditentukan, fungsi ini mengembalikan tabel alamat IP tetangga yang hanya berisi entri IPv4.
AF_INET6
23
Keluarga alamat Protokol Internet versi 6 (IPv6). Ketika parameter ini ditentukan, fungsi ini mengembalikan tabel alamat IP tetangga yang hanya berisi entri IPv6.

[out] Table

Penunjuk ke struktur MIB_IPNET_TABLE2 yang berisi tabel entri alamat IP tetangga di komputer lokal.

Mengembalikan nilai

Jika fungsi berhasil, nilai yang dikembalikan NO_ERROR atau ERROR_NOT_FOUND.

Jika fungsi gagal atau tidak mengembalikan data, nilai yang dikembalikan adalah salah satu kode kesalahan berikut.

Menampilkan kode Deskripsi
ERROR_INVALID_PARAMETER
Parameter yang tidak valid diteruskan ke fungsi. Kesalahan ini dikembalikan jika penunjuk NULL diteruskan dalam parameter Tabel atau parameter Keluarga tidak ditentukan sebagai AF_INET, AF_INET6, atau AF_UNSPEC.
ERROR_NOT_ENOUGH_MEMORY
Sumber daya memori tidak cukup tersedia untuk menyelesaikan operasi.
ERROR_NOT_FOUND
Tidak ada entri alamat IP tetangga seperti yang ditentukan dalam parameter Keluarga yang ditemukan.

Nilai pengembalian ini menunjukkan bahwa panggilan ke fungsi GetIpNetTable2 berhasil, tetapi tidak ada data yang akan dikembalikan. Ini dapat terjadi ketika AF_INET ditentukan dalam parameter Family dan tidak ada entri ARP yang akan dikembalikan.

ERROR_NOT_SUPPORTED
Permintaan tidak didukung.

Kesalahan ini dikembalikan jika tidak ada tumpukan IPv4 di komputer lokal dan AF_INET ditentukan dalam parameter Keluarga . Kesalahan ini juga dikembalikan jika tidak ada tumpukan IPv6 di komputer lokal dan AF_INET6 ditentukan dalam parameter Keluarga . Kesalahan ini juga dikembalikan pada versi Windows di mana fungsi ini tidak didukung.

Lainnya
Gunakan FormatMessage untuk mendapatkan string pesan untuk kesalahan yang dikembalikan.

Keterangan

Fungsi GetIpNetTable2 ditentukan pada Windows Vista dan yang lebih baru.

The
Fungsi GetIpNetTable2 menghitung alamat IP tetangga pada sistem lokal dan mengembalikan informasi ini dalam struktur MIB_IPNET_TABLE2 .

Entri alamat IP tetangga dikembalikan dalam struktur MIB_IPNET_TABLE2 dalam buffer yang diarahkan oleh parameter Tabel . Struktur MIB_IPNET_TABLE2 berisi jumlah entri alamat IP tetangga dan array struktur MIB_IPNET_ROW2 untuk setiap entri alamat IP tetangga. Ketika struktur yang dikembalikan ini tidak lagi diperlukan, kosongkan memori dengan memanggil FreeMibTable.

Parameter Keluarga harus diinisialisasi ke AF_INET, AF_INET6, atau AF_UNSPEC.

Perhatikan bahwa struktur MIB_IPNET_TABLE2 yang dikembalikan yang ditunjukkan oleh parameter Tabel mungkin berisi padding untuk perataan antara anggota NumEntries dan entri array MIB_IPNET_ROW2 pertama di anggota Tabel dari struktur MIB_IPNET_TABLE2 . Padding untuk perataan mungkin juga ada di antara entri array MIB_IPNET_ROW2 . Akses apa pun ke entri array MIB_IPNET_ROW2 harus mengasumsikan padding mungkin ada.

Contoh

Contoh berikut mengambil tabel tetangga IP, lalu mencetak nilai untuk entri baris tetangga IP dalam tabel.

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif

#include <windows.h>
#include <winsock2.h>
#include <ws2ipdef.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")

int main()
{

    // Declare and initialize variables

    int i;
    unsigned int j;
    unsigned long status = 0;

    PMIB_IPNET_TABLE2 pipTable = NULL;
//    MIB_IPNET_ROW2 ipRow;

    status = GetIpNetTable2(AF_INET, &pipTable);
    if (status != NO_ERROR) {
        printf("GetIpNetTable for IPv4 table returned error: %ld\n", status);
        exit(1);
    }
    // Print some variables from the table
    printf("Number of IPv4 table entries: %d\n\n", pipTable->NumEntries);

    for (i = 0; (unsigned) i < pipTable->NumEntries; i++) {
//        printf("Table entry: %d\n", i);
        printf("IPv4 Address[%d]:\t %s\n", (int) i,
               inet_ntoa(pipTable->Table[i].Address.Ipv4.sin_addr));
        printf("Interface index[%d]:\t\t %lu\n", (int) i,
               pipTable->Table[i].InterfaceIndex);

        printf("Interface LUID NetLuidIndex[%d]:\t %lu\n",
               (int) i, pipTable->Table[i].InterfaceLuid.Info.NetLuidIndex);
        printf("Interface LUID IfType[%d]: ", (int) i);
        switch (pipTable->Table[i].InterfaceLuid.Info.IfType) {
        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 loopback\n");
            break;
        case IF_TYPE_ATM:
            printf("ATM\n");
            break;
        case IF_TYPE_IEEE80211:
            printf("802.11 wireless\n");
            break;
        case IF_TYPE_TUNNEL:
            printf("Tunnel encapsulation\n");
            break;
        case IF_TYPE_IEEE1394:
            printf("IEEE 1394 (Firewire)\n");
            break;
        default:
            printf("Unknown: %d\n",
                   pipTable->Table[i].InterfaceLuid.Info.IfType);
            break;
        }

        printf("Physical Address[%d]:\t ", (int) i);
        if (pipTable->Table[i].PhysicalAddressLength == 0)
            printf("\n");
//        for (j = 0; (unsigned) j < pipTable->Table[i].PhysicalAddressLength; j++)
//         printf ("%c" 
        for (j = 0; j < pipTable->Table[i].PhysicalAddressLength; j++) {
            if (j == (pipTable->Table[i].PhysicalAddressLength - 1))
                printf("%.2X\n", (int) pipTable->Table[i].PhysicalAddress[j]);
            else
                printf("%.2X-", (int) pipTable->Table[i].PhysicalAddress[j]);
        }

        printf("Physical Address Length[%d]:\t %lu\n", (int) i,
               pipTable->Table[i].PhysicalAddressLength);

        printf("Neighbor State[%d]:\t ", (int) i);
        switch (pipTable->Table[i].State) {
        case NlnsUnreachable:
            printf("NlnsUnreachable\n");
            break;
        case NlnsIncomplete:
            printf("NlnsIncomplete\n");
            break;
        case NlnsProbe:
            printf("NlnsProbe\n");
            break;
        case NlnsDelay:
            printf("NlnsDelay\n");
            break;
        case NlnsStale:
            printf("NlnsStale\n");
            break;
        case NlnsReachable:
            printf("NlnsReachable\n");
            break;
        case NlnsPermanent:
            printf("NlnsPermanent\n");
            break;
        default:
            printf("Unknown: %d\n", pipTable->Table[i].State);
            break;
        }

        printf("Flags[%d]:\t\t %u\n", (int) i,
               (unsigned char) pipTable->Table[i].Flags);

        printf("ReachabilityTime[%d]:\t %lu\n\n", (int) i,
               pipTable->Table[i].ReachabilityTime);

    }
    FreeMibTable(pipTable);
    pipTable = NULL;

    exit(0);
}


Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 [hanya aplikasi desktop]
Target Platform Windows
Header netioapi.h (termasuk Iphlpapi.h)
Pustaka Iphlpapi.lib
DLL Iphlpapi.dll

Lihat juga

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2