| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Сети > MACtoIP |
| Автор: Poseidon 21.2.2006, 22:06 |
| Имеется локальная сеть с собственным сервером, каторый раздает IP адреса пользователям исходя из их MAC-адресов. Т.е., другими словами, у пользователей сети статические сетевые IP. Так вот как узнать сетевой IP, зная MAC-адрес? В принципе можно получать и все IP-адреса машины, каторая имеет определенный MAC-адрес, а потом фильтровать. Но вот вопрос, как конвертировать MAC в IP? |
| Автор: Snowy 21.2.2006, 23:03 |
| Тут требуется некоторое уточнение. Конвертировать MAC в IP однозначно нельзя. Можно конвертировать MAC в сетевой интерфейс, IP в сетевой интерфейс. Тут связь многие-ко-многим. Хотя, наличием нескольких MAC адресов у одного сетевого интерфейса можно пренебречь. Тогда задача сводитсяк получению списка IP адресов для сетевого интерфейса, имеющего заданны MAC. Как правило он тоже один, но исключения довольно частые, чтобы ими пренебречь. Итак, каковы исходные условия? У тебя есть MAC. Ты имеешь список IP или хочешь его получить? Если имеешь, то тут все понятно - все эти IP и принадлежат данному MAC. Это и есть "конвертация". Однозначного представления не получить. Если вопрос в том, как получить соответствие MAC = IP адреса. То порядок действия таков: Для начала нужно пингануть все IP сети, чтобы заполнилась ARP таблица. Затем берем нашу ARP таблицу и просто перибираем все записи. В этом тебе поможет функция GetIpNetTable. Там полное соответствие - сетевой интерфейс - MAC - IP. Разбивка по интерфейсу. Пример рисовать не буду - в MSDN имеется вся необходимая инфа, а пример на дельфи подскажет любой поисковик. Далее. Метод не очень оптимальный. Если требуется скорость, то лучше просмотреть ARP таблицу и пинговать только те IP, которых еще нет. Вроде все. Если что - спрашивай. |
| Автор: Poseidon 21.2.2006, 23:52 |
| Условия следующие: у меня есть локалка, в каторой IP можно молучить либо от сервера (постоянный и привязан к MAC), либо прописать вручную. Так вот мне в программе нужно привязка к IP. Т.е. я хочу в локалке точно знать у кого прога запущена (это легко сделать, зная IP, т.к. они статические). Но IP можно прописать самому и таким образом выйти в сеть под чужим адресом => программа тоже примет такого юзера за другого. Определить MAC-адрез машины, на катором запущена програма труда не составит (как и определить IP). Вот только подменить MAC гораздо сложднее, чем IP. Поэтому возникла идея, а почему бы не получать IP по MAC самостоятельно, как это делает Windows при подключении к сети при условии, что в настройках указано получение IP автоматом. Про то, что нужно запросить у сетевого сервера (каторый IP раздает) ARP таблицу, я думал, только вот не совсем понял как. Если я буду иметь ARP таблицу, то тут вопросов нет. Но вот как ее получить? В общем все уперлось в PS. Возможно есть совершенно другой вариант задуманного... |
| Автор: Snowy 22.2.2006, 00:06 |
| Другого варианта нет. ARP таблица динамическая. Она заполняется по мере обращения к IP адресам. Обращаясь к IP, ты (точнее винда) посылаешь броадкаст: "Чей IP такой-то". Любаямашина, знающая MAC, соответствующий этому IP, высылает ответ. Ответ ложится в твою ARP таблицу. Не обращаесь ни к кому, твоя ARP таблица пуста. Проверяем: Запускаем коммандную строку. Даем комманду "apr -a" Получаем распечатку ARP таблицы. Делаем ping айпишника, которого в ней нет. Снова даем "arp -a". Вот он и появился. По другому MAC ты не получишь - сама система устроена так. |
| Автор: Poseidon 22.2.2006, 00:44 |
| Snowy, такой вопрос. Как мне получить ARP таблицу? Т.е. то, что показывает cmd при "apr -a" меня вполне устраивает. Если это еще будет получатся с такой же скоростью, но вообще превосходно... |
| Автор: Snowy 22.2.2006, 00:59 |
| Набери в гугляндексе "Delphi GetIpNetTable" Найдешь примеры. Описание в MSDN. Работает даже быстрее Единственное, что не все записи могут там быть, тогда придется потратить время на пинг. А кого пинговать? Придется всех. |
| Автор: Poseidon 22.2.2006, 01:58 |
| Все, разобрался. Спасибо Snowy и Girder (за код) |