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