Форумы портала PHP.SU » PHP » Пользовательские функции » Функция для определения mac адреса

Страниц (1): [1]
 

1. EuGen - 07 Марта, 2008 - 18:49:48 - перейти к сообщению
Такой функции в PHP нет.
Но если велика охота, можно сделать так:
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $ip=getenv("REMOTE_ADDR");
  4. $matches=array();
  5. if (PHP_OS=='WINNT')
  6. {
  7.    exec("arp -a", $rgResult);
  8.    $mac_template="/[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}\-[\d|A-F]{2}/i";
  9.    foreach($rgResult as $key=>$value)
  10.    {
  11.       if (strpos($value, $ip)!==FALSE)
  12.       {
  13.          preg_match($mac_template, $value, $matches);
  14.          break;
  15.       }
  16.    };
  17. }
  18. else
  19. {
  20.    exec("arp -a | grep $ip", $rgResult);
  21.    $mac_template="/[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}\:[\d|A-F]{2}/i";
  22.    preg_match($mac_template, $rgResult[0], $matches);
  23. }
  24. $mac=$matches[0];// собственно, Ваш MAC-адрес.
  25. ?>
  26.  

Сработает, только если пользователь не работает через прокси (иначе это будет MAC-адрес последнего хоста на пути следования tcp-пакета). Так же возможны "глюки", если пользователь делает первое обращение к серверу (ибо в этом случае у сервера для его машины еще нет записи в arp таблице).
P.S. Скрипт написан мной "на коленке", проверялся только в Win32, поэтому не претендует на полную правильность.
2. SLITE - 12 Сентября, 2009 - 20:04:30 - перейти к сообщению
чёто неработает
3. EuGen - 13 Сентября, 2009 - 15:39:59 - перейти к сообщению
Да?
Что именно, функция тестировалась.
4. Ch_chov - 13 Сентября, 2009 - 17:36:32 - перейти к сообщению
Тоже не работает.

Цитата:
if (strpos($value, $ip)!==FALSE)
Это условие не срабатывает ни разу, так как ни один из интерфейсов не имеет IP, который даёт
getenv("REMOTE_ADDR") – 127.0.0.1
5. EuGen - 13 Сентября, 2009 - 23:27:26 - перейти к сообщению
Неужто. А с чего Вы взяли, что getenv('REMOTE_ADDR') вернет адрес loopback-интерфейса?
Если имеется ввиду определение собственного адреса, то есть Вы запускаете функцию для локального адреса (например, у Вас веб-сервер слушает 127.0.0.1 и Вы запускаете скрипт на машине веб-сервера), то это неудивительно.
Функция предназначена для определения mac-адреса клиента, который запустил скрипт в локальной сети.
Можете дописать для случая локального адреса - то есть если getenv('REMOTE_ADDR') возвращает реально свой IP-адрес, то пользоваться не arp-таблицей, а ifconfig для unix или ipconfig для windows.
6. Ch_chov - 14 Сентября, 2009 - 09:25:00 - перейти к сообщению
Цитата:
Функция предназначена для определения mac-адреса клиента, который запустил скрипт в локальной сети.

Надо было сразу уточнить. mac адреса клиентов из сети определяются нормально.


З.Ы. Для определения локального mac адреса в windows удобней пользовать getmac
7. EuGen - 14 Сентября, 2009 - 11:04:43 - перейти к сообщению
Ch_chov пишет:
Надо было сразу уточнить.

А какой смысл определять свой собственный?

А getmac, насколько я помню, не показывает привязки к IP-адресу, что, в случае нескольких сетевых интерфейсов, делает невозможным решение задачи определения mac-адреса по IP.
8. Ch_chov - 14 Сентября, 2009 - 11:41:56 - перейти к сообщению
Цитата:
А какой смысл определять свой собственный?

Это уже другой вопрос. Может кому то понадобится собрать сведения о своей системе или еще что то.
9. Uchkuma - 07 Июля, 2010 - 09:07:32 - перейти к сообщению
В чем может быть дело, если массив $rgResult пуст? В случае, если система не WINNT.
10. EuGen - 09 Июля, 2010 - 11:22:10 - перейти к сообщению
Выполните на своей машине arp -a и посмотрите, в каком формате система отдает таблицу. (хотя маловероятно, что в другом)
11. Uchkuma - 09 Июля, 2010 - 12:49:01 - перейти к сообщению
С форматом все в порядке. Отсутствует нужный IP в таблице.
12. EuGen - 13 Июля, 2010 - 11:49:26 - перейти к сообщению
Если отсутствует, значит, не делался никакой запрос на определение mac-адреса нужной машины.
Если эта машина вызывала скрипт, то это возможно только в случае, если она находится в другом сегменте сети (за сетевым устройством 2-го уровня и выше)

 

Powered by ExBB FM 1.0 RC1