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_INET と PF_INET) ので、どちらの定数も使用できます。
Windows Vista 以降用にリリースされた Windows SDK では、ヘッダー ファイルの編成が変更され、このメンバーの使用可能な値は、Ws2def.h ヘッダー ファイルで定義されます。
現在サポートされている値は、AF_INET、AF_INET6、および AF_UNSPECです。
[out] Table
ローカル コンピューター上の近隣 IP アドレス エントリのテーブルを含む MIB_IPNET_TABLE2 構造体へのポインター。
戻り値
関数が成功した場合、戻り値はNO_ERRORまたはERROR_NOT_FOUND。
関数が失敗した場合、またはデータが返されない場合、戻り値は次のいずれかのエラー コードになります。
リターン コード | 形容 |
---|---|
|
無効なパラメーターが関数に渡されました。 このエラーは、NULL ポインターが Table パラメーターで渡された場合、または Family パラメーターが AF_INET、AF_INET6、または AF_UNSPECとして指定されていない場合に返されます。 |
|
操作を完了するために使用できるメモリ リソースが不足しています。 |
|
ファミリ パラメーターで指定されている近隣 IP アドレス エントリが見つかりませんでした。
この戻り値は、GetIpNetTable2 関数の呼び出しは成功しましたが、返すデータがなかったことを示します。 これは、Family パラメーターにAF_INETが指定されていて、返される ARP エントリがない場合に発生する可能性があります。 |
|
要求はサポートされていません。
このエラーは、ローカル コンピューター上に IPv4 スタックがなく、AF_INET が Family パラメーターで指定されている場合に返されます。 このエラーは、ローカル コンピューター上に IPv6 スタックがなく、AF_INET6 が Family パラメーターで指定されている場合にも返されます。 このエラーは、この関数がサポートされていない 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に初期化する必要があります。
Table パラメーターによって示される返される MIB_IPNET_TABLE2 構造体には、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 [デスクトップ アプリのみ] |
ターゲット プラットフォーム の |
ウィンドウズ |
ヘッダー | netioapi.h (Iphlpapi.h を含む) |
ライブラリ | Iphlpapi.lib |
DLL | Iphlpapi.dll |
関連項目
CreateIpNetEntry2 の
FlushIpNetTable2 の
FreeMibTable を
GetIpNetEntry2 の
SetIpNetEntry2 の