.NET/ARPテーブルを取得し表示するサンプル・GetIpNetTable
の編集
Top
/
.NET
/
ARPテーブルを取得し表示するサンプル・GetIpNetTable
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
.NET
.NET/.NETでpingを実現する・System.Net.NetworkInformation.Ping
.NET/ARPテーブルを取得し表示するサンプル・GetIpNetTable
.NET/CPUコア毎の使用率を取得する
.NET/CPU使用率を取得する
.NET/DateとDateTimeの違い
.NET/HttpClientを使って指定したURLのページを取得する
.NET/IPv4からMACアドレス取得する・SendARP
.NET/IPアドレスからホスト名を取得するサンプルコード
.NET/ListのStringをカンマ区切りにする方法
.NET/Listを配列に配列をListに変換する
.NET/NET6.0でSQLiteを使ってみた Microsoft.Data.Sqlite
.NET/ODBCを使用してデータベースに接続しSQLを実行するサンプル
.NET/String.Splitで空要素を残す、空要素を削除するオプションについて
.NET/StringBuilderをバイト配列に変換する
.NET/Stringの配列をCSVにする方法
.NET/UNIX時間への変換・DateTimeOffset
.NET/UNIX時間をDateTimeOffset, DateTimeにする
.NET/Web APIからJSONを取得し値を表示する・DataContractJsonSerializer
.NET/WMIを使って物理メモリ・仮想メモリの使用量等を取得する
.NET/アルファベットを大文字、小文字に変換する
.NET/インストールされているODBCドライバ一覧を取得するサンプル
.NET/コンソールプログラムからトースト通知をするサンプル
.NET/サスペンド前・復帰の時に処理を行いたい
.NET/スペースのみの文字列、空の文字列、サイズ0の文字列を判定する
.NET/スリープの抑止、モニター電源オフの抑止のサンプルコード
.NET/ターゲットにしている.NETを確認する操作手順
.NET/テキストファイルの読込・ReadAllText,ReadAllLines
.NET/テキストファイルの読込・StreamReader
.NET/テンポラリファイルの作成・ランダムな文字列の作成を作成する
.NET/テンポラリファイル名を取得する・GetRandomFileName
.NET/ディレクトリの有無を確認する
.NET/ネットワークカードの各種情報を取得するサンプルコード
.NET/バイト配列にファイルの内容をすべて読み込む
.NET/バイナリーファイルの作成・リード・ライト
.NET/ファイルなの?ディレクトリなの?の判別
.NET/ファイルの有無を確認する
.NET/ファイル一覧を取得する・GetFiles,EnumerateFiles
.NET/プログラムに渡された引数を取得する方法
.NET/ユーザーが無操作の状態を取得する・GetLastInputInfo
.NET/三項演算子のサンプルコード
.NET/四捨五入をするときはMidpointRounding.AwayFromZeroにすること
.NET/指定した時間間隔でイベントを発行する・Timer
.NET/数値を指定した桁数分ゼロで埋めたい・ToString
.NET/文字列(String)を左右逆転し文字列(String)で返却する方法
.NET/文字列をバイト配列に変換・バイト配列を文字列に変換
.NET/文字列を区切り文字で分割する方法・Split
.NET/文字列宣言の先頭の@について
.NET/文字列数値を指定した桁数分ゼロで埋めたい・PadLeft
.NET/文字列日付をDateTimeに変換する
.NET/文字列配列orList配列に指定した文字列が存在するかを確認する方法
.NET/時間(日数+時間)が格納できるTimeSpan
.NET/月末の日を取得する方法・DaysInMonth
.NET/現在の日時を取得する
.NET/符号付バイトsbyte,符号なしbyteをintegerに変換する
.NET/管理者として実行されているかどうか確認するサンプルコード
.NET/連想配列(ハッシュ)のキーと値を取得する
.NET/連想配列(ハッシュ)を使ってみる・Dictionary
.NET/閏年かを調べる方法
AutoTicketLinkName
FrontPage
MenuBar
OSS
OSS/XYM日本円価格(シンボル日本円価格 (XYMJPYPrice)
OSS/ビットコイン日本円価格(ビットコイン日本円価格 (BitcoinJPYPrice)
RecentDeleted
VS
VS/Debug.Writeをイミディエイトウィンドウに出力する方法
VS/Visual Studio 2022に Spy++をインストールする手順
VS/VS2022の配色テーマの変更操作
VS/XAML編集に使うツールボックスの再表示する操作手順
VS/インデントなどコードを整形するショートカットの紹介
VS/コメントにするショートカットキー
VS/ショートカットキーで大文字・小文字に変換する
VS/ビルド中に中断したい場合の操作手順
WPF
WPF/DataGridを使ってみる
WPF/起動してもMainWindowを表示したくない場合
お約束
プライバシーポリシー
最初にお読みください
#navi(../) *ARPテーブルを取得し表示するサンプル・GetIpNetTable API [#z9b3d394] iphlpapi.dll の GetIpNetTable API を使用しARPリストを取得しIPアドレス、MACアドレス、タイプを表示するコンソールアプリケーションのC#サンプルコードを公開しました。~ #contents * 関連記事 [#ka7de2a8] -[[IPv4からMACアドレス取得するSendARP()APIを使ってみる>.NET/IPv4からMACアドレス取得する・SendARP]] * 参考サイト [#fa1ec922] - c# get arp cache~ https://gist.github.com/invictus-0x90/2e1ebcfefd8d7478e695131b88ce2926 - SIN@SAPPOROWORKSの覚書 ARPテーブルの取得 (C#)(F#)~ https://furuya02.hatenablog.com/entry/20111107/1399766912 - Microsoft GetIpNetTable 関数 (iphlpapi.h)~ https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-getipnettable - Microsoft MIB_IPNETTABLE structure (ipmib.h)~ https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnettable - Microsoft MIB_IPNETROW_LH structure (ipmib.h)~ https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnetrow_lh * 動作確認環境 [#qc949720] - Windows 10 ver.22H2 - .NET6.0 - Visual Studio 2022 * C#サンプルコード [#e6de880e] GetIpNetTable API を使用し取得したARPテーブル情報を表示するC#サンプルコードを以下に記します。~ 説明に関してはコメントを参照してください。 #ref(Program.cs) using System.Runtime.InteropServices; namespace ARPList { internal class Program { // GetIpNetTable 関数 (iphlpapi.h): https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-getipnettable [DllImport("iphlpapi.dll", EntryPoint = "GetIpNetTable")] static extern int GetIpNetTable(IntPtr pIpNetTable, ref int pdwSize, bool bOrder); [StructLayout(LayoutKind.Sequential)] struct MIB_IPNETROW { [MarshalAs(UnmanagedType.U4)] public uint dwIndex; [MarshalAs(UnmanagedType.U4)] public uint dwPhysAddrLen; [MarshalAs(UnmanagedType.U1)] public byte mac0; [MarshalAs(UnmanagedType.U1)] public byte mac1; [MarshalAs(UnmanagedType.U1)] public byte mac2; [MarshalAs(UnmanagedType.U1)] public byte mac3; [MarshalAs(UnmanagedType.U1)] public byte mac4; [MarshalAs(UnmanagedType.U1)] public byte mac5; [MarshalAs(UnmanagedType.U1)] public byte mac6; [MarshalAs(UnmanagedType.U1)] public byte mac7; [MarshalAs(UnmanagedType.U4)] public uint dwAddr; [MarshalAs(UnmanagedType.U4)] public uint dwType; } private const int SUCCESS = 0; private const int ERROR_INSUFFICIENT_BUFFER = 0x007A; private const uint MIB_IPNET_TYPE_OTHER = 1; private const uint MIB_IPNET_TYPE_INVALID = 2; private const uint MIB_IPNET_TYPE_DYNAMIC = 3; private const uint MIB_IPNET_TYPE_STATIC = 4; static void Main(string[] args) { int result; int requestBuffSize = 0; // ARPテーブル格納用のメモリエリアを確保する // 格納メモリ不足の ERROR_INSUFFICIENT_BUFFER が返却され、requestBuffSize に必要なメモリサイズが返却される // ERROR_INSUFFICIENT_BUFFER 以外が返却された場合は処理を中止する // GetIpNetTable: https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-getipnettable result = GetIpNetTable(IntPtr.Zero, ref requestBuffSize, true); if (result != ERROR_INSUFFICIENT_BUFFER) { Console.Error.WriteLine("GetIpNetTable API Error:" + result); Environment.Exit((int)result); } try { // Marshal.AllocCoTaskMem: https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.marshal.alloccotaskmem IntPtr resultBuff = Marshal.AllocCoTaskMem(requestBuffSize); // 確保した格納用メモリを引数に設定し GetIpNetTable API を実行する // 0(SUCCESS)以外が返却された場合は処理を中止する result = GetIpNetTable(resultBuff, ref requestBuffSize, true); if (result != 0) { Environment.Exit(result); } // ARPエントリ数が0の場合、処理を終了する int entries = Marshal.ReadInt32(resultBuff); if (entries == 0) { Environment.Exit(0); } // GetIpNetTable API から返却された MIB_IPNETTABLE.dwNumEntries DWORD分を移動 // MIB_IPNETTABLE: https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnettable IntPtr currentPtr = IntPtr.Add(resultBuff, sizeof(Int32)); // 取得したARP情報を格納するListオブジェクトを準備 List<MIB_IPNETROW> arpTableList = new List<MIB_IPNETROW>(); for (int i = 0; i < entries; i++) { // List<MIB_IPNETROW> に追加 arpTableList.Add((MIB_IPNETROW)Marshal.PtrToStructure(currentPtr, typeof(MIB_IPNETROW))); // 次のデータの先頭に移動 currentPtr = IntPtr.Add(currentPtr, Marshal.SizeOf(typeof(MIB_IPNETROW))); } // メモリの解放 Marshal.FreeHGlobal(resultBuff); // 取得したARPテーブルからMACアドレス、IPアドレスの表示する foreach (var item in arpTableList) { //IPアドレス Byte[] b = BitConverter.GetBytes(item.dwAddr); string ip = string.Format("{0}.{1}.{2}.{3}", b[0], b[1], b[2], b[3]); string mac = string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}", item.mac0, item.mac1, item.mac2, item.mac3, item.mac4, item.mac5); // TYPE // MIB_IPNET_TYPE:https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnetrow_lh string type = string.Empty; switch (item.dwType) { case MIB_IPNET_TYPE_OTHER: type = "OTHER"; break; case MIB_IPNET_TYPE_INVALID: type = "INVALID"; break; case MIB_IPNET_TYPE_DYNAMIC: type = "DYNAMIC"; break; case MIB_IPNET_TYPE_STATIC: type = "STATIC"; break; } Console.WriteLine("| {0,-15} | {1} | {2,-7} |", ip, mac, type); } } catch (Exception e) { Console.Error.WriteLine("Exception thrown:" + e.Message); Environment.Exit(1); } } } } * 実行結果 [#d1174116] マルチキャストアドレスも表示されていますね。~ ネットワーク上のARPキャッシュの情報が表示されました。 #br #ref(01.png) 以上、GetIpNetTable API を使ってARPテーブル情報を表示するC#サンプルコードでした。
タイムスタンプを変更しない
#navi(../) *ARPテーブルを取得し表示するサンプル・GetIpNetTable API [#z9b3d394] iphlpapi.dll の GetIpNetTable API を使用しARPリストを取得しIPアドレス、MACアドレス、タイプを表示するコンソールアプリケーションのC#サンプルコードを公開しました。~ #contents * 関連記事 [#ka7de2a8] -[[IPv4からMACアドレス取得するSendARP()APIを使ってみる>.NET/IPv4からMACアドレス取得する・SendARP]] * 参考サイト [#fa1ec922] - c# get arp cache~ https://gist.github.com/invictus-0x90/2e1ebcfefd8d7478e695131b88ce2926 - SIN@SAPPOROWORKSの覚書 ARPテーブルの取得 (C#)(F#)~ https://furuya02.hatenablog.com/entry/20111107/1399766912 - Microsoft GetIpNetTable 関数 (iphlpapi.h)~ https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-getipnettable - Microsoft MIB_IPNETTABLE structure (ipmib.h)~ https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnettable - Microsoft MIB_IPNETROW_LH structure (ipmib.h)~ https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnetrow_lh * 動作確認環境 [#qc949720] - Windows 10 ver.22H2 - .NET6.0 - Visual Studio 2022 * C#サンプルコード [#e6de880e] GetIpNetTable API を使用し取得したARPテーブル情報を表示するC#サンプルコードを以下に記します。~ 説明に関してはコメントを参照してください。 #ref(Program.cs) using System.Runtime.InteropServices; namespace ARPList { internal class Program { // GetIpNetTable 関数 (iphlpapi.h): https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-getipnettable [DllImport("iphlpapi.dll", EntryPoint = "GetIpNetTable")] static extern int GetIpNetTable(IntPtr pIpNetTable, ref int pdwSize, bool bOrder); [StructLayout(LayoutKind.Sequential)] struct MIB_IPNETROW { [MarshalAs(UnmanagedType.U4)] public uint dwIndex; [MarshalAs(UnmanagedType.U4)] public uint dwPhysAddrLen; [MarshalAs(UnmanagedType.U1)] public byte mac0; [MarshalAs(UnmanagedType.U1)] public byte mac1; [MarshalAs(UnmanagedType.U1)] public byte mac2; [MarshalAs(UnmanagedType.U1)] public byte mac3; [MarshalAs(UnmanagedType.U1)] public byte mac4; [MarshalAs(UnmanagedType.U1)] public byte mac5; [MarshalAs(UnmanagedType.U1)] public byte mac6; [MarshalAs(UnmanagedType.U1)] public byte mac7; [MarshalAs(UnmanagedType.U4)] public uint dwAddr; [MarshalAs(UnmanagedType.U4)] public uint dwType; } private const int SUCCESS = 0; private const int ERROR_INSUFFICIENT_BUFFER = 0x007A; private const uint MIB_IPNET_TYPE_OTHER = 1; private const uint MIB_IPNET_TYPE_INVALID = 2; private const uint MIB_IPNET_TYPE_DYNAMIC = 3; private const uint MIB_IPNET_TYPE_STATIC = 4; static void Main(string[] args) { int result; int requestBuffSize = 0; // ARPテーブル格納用のメモリエリアを確保する // 格納メモリ不足の ERROR_INSUFFICIENT_BUFFER が返却され、requestBuffSize に必要なメモリサイズが返却される // ERROR_INSUFFICIENT_BUFFER 以外が返却された場合は処理を中止する // GetIpNetTable: https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-getipnettable result = GetIpNetTable(IntPtr.Zero, ref requestBuffSize, true); if (result != ERROR_INSUFFICIENT_BUFFER) { Console.Error.WriteLine("GetIpNetTable API Error:" + result); Environment.Exit((int)result); } try { // Marshal.AllocCoTaskMem: https://learn.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.marshal.alloccotaskmem IntPtr resultBuff = Marshal.AllocCoTaskMem(requestBuffSize); // 確保した格納用メモリを引数に設定し GetIpNetTable API を実行する // 0(SUCCESS)以外が返却された場合は処理を中止する result = GetIpNetTable(resultBuff, ref requestBuffSize, true); if (result != 0) { Environment.Exit(result); } // ARPエントリ数が0の場合、処理を終了する int entries = Marshal.ReadInt32(resultBuff); if (entries == 0) { Environment.Exit(0); } // GetIpNetTable API から返却された MIB_IPNETTABLE.dwNumEntries DWORD分を移動 // MIB_IPNETTABLE: https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnettable IntPtr currentPtr = IntPtr.Add(resultBuff, sizeof(Int32)); // 取得したARP情報を格納するListオブジェクトを準備 List<MIB_IPNETROW> arpTableList = new List<MIB_IPNETROW>(); for (int i = 0; i < entries; i++) { // List<MIB_IPNETROW> に追加 arpTableList.Add((MIB_IPNETROW)Marshal.PtrToStructure(currentPtr, typeof(MIB_IPNETROW))); // 次のデータの先頭に移動 currentPtr = IntPtr.Add(currentPtr, Marshal.SizeOf(typeof(MIB_IPNETROW))); } // メモリの解放 Marshal.FreeHGlobal(resultBuff); // 取得したARPテーブルからMACアドレス、IPアドレスの表示する foreach (var item in arpTableList) { //IPアドレス Byte[] b = BitConverter.GetBytes(item.dwAddr); string ip = string.Format("{0}.{1}.{2}.{3}", b[0], b[1], b[2], b[3]); string mac = string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}", item.mac0, item.mac1, item.mac2, item.mac3, item.mac4, item.mac5); // TYPE // MIB_IPNET_TYPE:https://learn.microsoft.com/en-us/windows/win32/api/ipmib/ns-ipmib-mib_ipnetrow_lh string type = string.Empty; switch (item.dwType) { case MIB_IPNET_TYPE_OTHER: type = "OTHER"; break; case MIB_IPNET_TYPE_INVALID: type = "INVALID"; break; case MIB_IPNET_TYPE_DYNAMIC: type = "DYNAMIC"; break; case MIB_IPNET_TYPE_STATIC: type = "STATIC"; break; } Console.WriteLine("| {0,-15} | {1} | {2,-7} |", ip, mac, type); } } catch (Exception e) { Console.Error.WriteLine("Exception thrown:" + e.Message); Environment.Exit(1); } } } } * 実行結果 [#d1174116] マルチキャストアドレスも表示されていますね。~ ネットワーク上のARPキャッシュの情報が表示されました。 #br #ref(01.png) 以上、GetIpNetTable API を使ってARPテーブル情報を表示するC#サンプルコードでした。
テキスト整形のルールを表示する
添付ファイル:
01.png
65件
[
詳細
]
Program.cs
71件
[
詳細
]