次の方法で共有


GetIpNetTable2 関数 (netioapi.h)

GetIpNetTable2 関数は、ローカル コンピューター上の IP 近隣テーブルを取得します。

構文

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

パラメーター

[in] Family

取得するアドレス ファミリ。

アドレス ファミリに使用できる値は、 Winsock2.h ヘッダー ファイルに一覧表示されます。 AF_ アドレス ファミリ定数とPF_ プロトコル ファミリ定数の値は同一であるため ( たとえば、AF_INETPF_INET)、どちらの定数も使用できます。

Windows Vista 以降用にリリースされたWindows SDKでは、ヘッダー ファイルのorganizationが変更され、このメンバーの使用可能な値は Ws2def.h ヘッダー ファイルで定義されます。 Ws2def.h ヘッダー ファイルは Winsock2.h に自動的に含まれるので、直接使用しないでください。

現在サポートされている値は 、AF_INETAF_INET6AF_UNSPECです。

意味
AF_UNSPEC
0
アドレス ファミリが指定されていません。 このパラメーターを指定すると、この関数は IPv4 エントリと IPv6 エントリの両方を含む近隣 IP アドレス テーブルを返します。
AF_INET
2
インターネット プロトコル バージョン 4 (IPv4) アドレス ファミリ。 このパラメーターを指定すると、この関数は IPv4 エントリのみを含む近隣 IP アドレス テーブルを返します。
AF_INET6
23
インターネット プロトコル バージョン 6 (IPv6) アドレス ファミリ。 このパラメーターを指定すると、この関数は IPv6 エントリのみを含む近隣 IP アドレス テーブルを返します。

[out] Table

ローカル コンピューター上の近隣 IP アドレス エントリのテーブルを含む MIB_IPNET_TABLE2 構造体へのポインター。

戻り値

関数が成功した場合、戻り値はNO_ERRORまたはERROR_NOT_FOUND。

関数が失敗した場合、またはデータが返されない場合、戻り値は次のいずれかのエラー コードになります。

リターン コード 説明
ERROR_INVALID_PARAMETER
無効なパラメーターが関数に渡されました。 このエラーは、Table パラメーターに NULL ポインターが渡された場合、または Family パラメーターがAF_INET、AF_INET6、またはAF_UNSPECとして指定されていない場合返されます。
ERROR_NOT_ENOUGH_MEMORY
操作を完了するために使用できるメモリ リソースが不足しています。
ERROR_NOT_FOUND
Family パラメーターで指定された近隣 IP アドレス エントリが見つかりませんでした。

この戻り値は、 GetIpNetTable2 関数の呼び出しが成功したが、返すデータがなかったことを示します。 これは、 family パラメーターでAF_INETが指定されていて、返される ARP エントリがない場合に発生する可能性があります。

ERROR_NOT_SUPPORTED
要求はサポートされていません。

このエラーは、ローカル コンピューター上に IPv4 スタックがなく、Family パラメーターでAF_INETが指定されている場合に返されます。 このエラーは、ローカル コンピューター上に IPv6 スタックがなく、Family パラメーターでAF_INET6が指定されている場合にも返されます。 このエラーは、この関数がサポートされていない Windows のバージョンでも返されます。

その他
FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。

注釈

GetIpNetTable2 関数は、Windows Vista 以降で定義されています。

次に、
GetIpNetTable2 関数は、ローカル システム上の近隣 IP アドレスを列挙し、この情報を MIB_IPNET_TABLE2 構造で返します。

近隣 IP アドレス エントリは、Table パラメーターによって指されるバッファー内のMIB_IPNET_TABLE2構造で返されます。 MIB_IPNET_TABLE2構造体には、近隣 IP アドレス エントリ数と、各近隣 IP アドレス エントリのMIB_IPNET_ROW2構造体の配列が含まれています。 これらの返される構造体が不要になったら、 FreeMibTable を呼び出してメモリを解放します。

Family パラメーターは、AF_INET、AF_INET6、またはAF_UNSPECのいずれかに初期化する必要があります。

返されるMIB_IPNET_TABLE2構造体が Table パラメーターによって指されている場合、NumEntries メンバーと、MIB_IPNET_TABLE2 構造体のTable メンバー内の最初のMIB_IPNET_ROW2配列エントリとの間の配置のための埋め込みが含まれる場合があることに注意してください。 配置のためのパディングは、 MIB_IPNET_ROW2 配列エントリ間に存在する場合もあります。 MIB_IPNET_ROW2配列エントリへのアクセスは、埋め込みが存在する可能性があることを前提とする必要があります。

次の例では、IP 近隣テーブルを取得し、テーブル内の IP 近隣行エントリの値を出力します。

#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);
}


要件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー netioapi.h (Iphlpapi.h を含む)
Library Iphlpapi.lib
[DLL] Iphlpapi.dll

こちらもご覧ください

CreateIpNetEntry2

FlushIpNetTable2

FreeMibTable

GetIpNetEntry2

MIB_IPNET_ROW2

MIB_IPNET_TABLE2

ResolveIpNetEntry2

SetIpNetEntry2