ここでは 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)にした場合に、応答がありました。マジか!