[C#] ARP要求を送信してリモートPCのMACアドレスを取得する(SendARP関数)

Pocket

ここでは C# で、ARP要求を送信して応答からリモートPCのMACアドレスを取得するサンプルコードを掲載しています。

スポンサーリンク

ARPの送受信でリモートPCのMACアドレスを取得

次は、ARPの送受信を行ってリモートPCのMACアドレスを取得するサンプルコードです。詳細はサンプル内のコメントを参照ください。


        // using System.Runtime.InteropServices; が必要
        [DllImport("iphlpapi.dll", ExactSpelling = true)]
        private static extern int SendARP(int DestIP, int SrcIp, byte[] pMacAddr, ref int PhyAddrLen);

        private void button1_Click(object sender, EventArgs e)
        {
            // MACアドレスを取得するリモートPCのIPアドレス
            string dstIpAddr = "192.168.3.32";

            // 文字列(IPアッドレス)からIPAddressクラスに変換
            IPAddress dest = IPAddress.Parse(dstIpAddr);

            // IPアドレスを数値として取得する
            // ネットワークバイトオーダへの変換は要らない
            int destAddr = BitConverter.ToInt32(dest.GetAddressBytes(), 0);

            // MACアドレス用のバッファを確保
            byte[] pMacAddr = new byte[6];
            int PhyAddrLen = pMacAddr.Length;

            // ARPを送信
            int ret = SendARP(destAddr, 0, pMacAddr, ref PhyAddrLen);
            if(ret == 0)
            {
                // ARP応答が返ってきた場合
                string dstPhyAddr = string.Format("{0:x2}-{1:x2}-{2:x2}-{3:x2}-{4:x2}-{5:x2}", pMacAddr[0], 
                                                                                               pMacAddr[1], 
                                                                                               pMacAddr[2], 
                                                                                               pMacAddr[3], 
                                                                                               pMacAddr[4],
                                                                                               pMacAddr[5]);
                Console.WriteLine(dstPhyAddr);
            }
            else
            {
                // エラーコードを出力
                Console.WriteLine(ret.ToString());
            }
        }

ARPとは、そもそもIPアドレスからMACアドレスを逆引きするプロトコルです。普段はプロトコルスタックで勝手にやり取りを行っているため、その存在を知らない人もいることでしょう。

Ping (ICMPエコー)の送受信と同じく、ARP要求を受信したPCはARP応答を返すことになっています(Pingはファイアーウォール等で破棄されることもありますし、返さないことも多々ありますが)。

仮に PC-X というパソコンが ARP応答を返さないとすると、他のPCのARPテーブルに静的に PC-X のMACアドレスを登録しておかないと、PC-X とIPレベルの通信はできないことになります。

なお、ARPはIPv4のみで使用されます。IPv6の場合は近隣探索プロトコル(Neighbor Discovery)がARPの代わりとして使用されます。

 

上記のサンプルでリモートPCのIPアドレスをブロードキャスト(192.168.3.255)にした場合に、応答がありました。マジか!

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *