PHPからarpコマンドを実行してLAN内のMACアドレスとIPアドレスの変換テーブルを参照できるようにしてみました。単純に結果を正規表現にかけているだけです。
ちなみにひとつのMACが複数のIPを持つ場合には対応していません。それと、arpの性質上、頻繁にキャッシュクリアされるので、用途によっては注意が必要です。
<?php
$table = array();
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
exec('arp -a', $output); // for Windows
}
else {
exec('/usr/sbin/arp -a -n', $output); // for Linux(debian)
}
foreach ($output as $line) {
if (preg_match('/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*([0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2}[\-:][0-9a-f]{2})/i', $line, $matches)) {
$ip = $matches[1];
$mac = strtoupper(str_replace(array('-', ':'), '', $matches[2]));
$table[$mac] = $ip;
}
}
var_dump($table);
結果
array(2) {
["123456789ABC"]=>
string(13) "192.168.0.1"
["0003FFFFFFFF"]=>
string(15) "192.168.131.254"
}
Linuxのarpコマンドがarp -aで実行するとすごく遅いので、原因を調べていたら、デフォルトではIPアドレスからDNSの逆引きをしているということでした。-nオプションを付けることで、DNSリクエストを送らなくなるので一瞬で表示できます。

HOMMA Teppei

