#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アドレス取得するサンプルコードでした。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS