#author("2023-04-22T07:16:42+09:00","","") #author("2023-04-22T17:25:12+09:00","","") #navi(../) *IPv4からMACアドレス取得するSendARP()APIを使ってみる [#fc0f8e7d] iphlpapi.dllのSendARP関数を使用しIPv4アドレスからMACアドレスを取得するサンプルコードを以下に記します。~ MACアドレスを取得するIPv4アドレスはネットワーク上に存在しているPCのIPアドレスを指定しています。~ #contents * 参考 [#yf3a555d] * 関連記事 [#iff49ebe] -[[ARPテーブルを取得し表示するサンプルコード>.NET/ARPテーブルを取得し表示するサンプル・GetIpNetTable]] * 参考サイト [#yf3a555d] -Microsoft: SendARP 関数 (iphlpapi.h)~ https://learn.microsoft.com/ja-jp/windows/win32/api/iphlpapi/nf-iphlpapi-sendarp -Microsoft: IPAddress クラス~ https://learn.microsoft.com/ja-jp/dotnet/api/system.net.ipaddress - Microsoft: BitConverter クラス~ https://learn.microsoft.com/ja-jp/dotnet/api/system.bitconverter - Microsoft: BitConverter.ToInt32 メソッド~ https://learn.microsoft.com/ja-jp/dotnet/api/system.bitconverter.toint32 * 動作確認環境 [#t092ab12] - Windows 10 ver.22H2 - .NET6.0 - Visual Studio 2022 * サンプルコード [#ac0d019a] SendARPコマンドを使用したC#サンプルコードを以下に記します。~ IPv4アドレスを指定しMACアドレスを取得しています。~ 動作確認時は、みなさんの環境にあったIPv4アドレスに変更し実行してください。 エラーコードに67が返却された場合は、以下のような原因が考えられます。 - 同一サブネットではないためARPが届かない - 宛先の機器が動作していない using System.Net; using System.Runtime.InteropServices; // SendAPI Win32APIを使用するため namespace SendArpSample { internal class Program { [DllImport("iphlpapi.dll", ExactSpelling = true)] private static extern int SendARP(int DestIP, int SrcIp, byte[] pMacAddr, ref int PhyAddrLen); static void Main(string[] args) { string targetIPv4 = "192.168.1.201"; // MACアドレスを取得するIPv4アドレスを設定 int adr = BitConverter.ToInt32(IPAddress.Parse(targetIPv4).GetAddressBytes(), 0); //IPv4値を値に変換 byte[] macAdr = new byte[6]; // MACアドレス格納用 int macAdrLen = macAdr.Length; int ret = SendARP(adr, 0, macAdr, ref macAdrLen); // ARP送信(SendARP APIを実行) if (ret != 0) { Console.Error.WriteLine("error code: " + ret); Environment.Exit(ret); } string mac = string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}", macAdr[0], macAdr[1], macAdr[2], macAdr[3], macAdr[4], macAdr[5]); Console.WriteLine("IPv4:{0}, MAC:{1}", targetIPv4, mac); } } } ** 実行結果例 [#p00eddf4] 上記のコンソールアプリケーションを実行したときの出力例となります。 IPv4:192.168.1.201, MAC:xx-xx-xx-xx-xx-xx 以上、SendARP API を使ってIPv4からMACアドレス取得するサンプルコードでした。