![]() |
|
Модераторы: xvr |
![]()
|
|
| slavayo7777 |
|
||||
|
прогер Профиль Группа: Участник Сообщений: 14 Регистрация: 22.6.2011 Репутация: нет Всего: нет |
Добрый день.
Уже замучался рыть в интернете. Может подскажите... В моем устройстве необходимо узнать мак адресс узла, ip адрес которого мне выдает сервер. На этот адресс необходимо слать пакеты с данными. Устройство работает на Linux-2.6.10. На сколько я знаю, для генерации ARP нужен SOCK_RAW и самому забивать пакет и все заголовки. Что я и сделал.
Все прекрасно работает, пока не подключаешь устройство через шлюз к серверу. Например мое устройство имеет айпи 10.60.20.2, шлюз 10.60.20.1 к серверу 10.80.1.1. И сервер может выдать произвольный айпи, к которому можно достучаться через этот же шлюз. прописываю в своем устройстве шлюз 10.60.20.1:
Но так как я забиваю пакет сам, я в нем забиваю IP искомого узла, что в случае с gateway неверно (нужно подменить в теле ARP пакета искомый IP на IP гейта). Но как узнать из routing table какой айпи подставлять? утилита ping каким то образом это делает. Есть ли другой способ генерации ARP? Чтоб система сама заботилась об IP и маршрутизации. |
||||
|
|||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
это узнать невозможно.. ты можешь узнать мак только в той же зоне каллизии (не дальше ethernet-уровня).. -------------------- undefined |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
хотя, если ты настроишь на маршрутизаторе (шлюзе) proxyarp.. то впринципе можно.. но это не по-дефолту в любом случае..
-------------------- undefined |
|||
|
||||
| slavayo7777 |
|
|||
|
прогер Профиль Группа: Участник Сообщений: 14 Регистрация: 22.6.2011 Репутация: нет Всего: нет |
Я наверное неправильно выразился. Мне не нужен мак адресс конечного узла. Мне нужно узнать мак шлюза, чтобы слать через него пакеты на сервер. Моей программе заранее не известно, через что она работает: напрямую с сервером или через шлюз. Ну так вот, не охото добавлять в программу дополнительную настройку шлюза, хочется чтобы прописав маршрут в route, она могла сама понять, через что ей работать. И из настроек в программе был бы только IP сервера. А как до последнего дойдут пакеты, будет решать ОС. |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
это вопрос маршрутизиции, зачем связываться с канальным уровнем? почему не работать на сетевом? -------------------- undefined |
|||
|
||||
| slavayo7777 |
|
|||
|
прогер Профиль Группа: Участник Сообщений: 14 Регистрация: 22.6.2011 Репутация: нет Всего: нет |
Как тогда сделать ARP запрос на сетевом уровне? В общем, задача узнать мак адресс шлюза, чтобы слать пакеты. |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
на сетевом уровне ARP'а нет, там есть IP.. вообще слать пакеты ты хочешь куда? на шлюз или на целевую машину за шлюзом? -------------------- undefined |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
я понял, что ты хочешь (мне кажется, что понял)..
ну тогда схема такая: посылаешь широковещательный пакет типа - у кого ip = xxx.xxx.xxx.xxx, ловишь ответ если ответ получен, значит машина в твоей подсети и можно слать пакет по тому маку, который получен иначе посылаешь широковещательный запрос - у кого ip = ipшлюза (его ip берешь из таблицы маршрутизации), ловишь ответ если ответ получен направляешь пакет по тому маку -------------------- undefined |
|||
|
||||
| slavayo7777 |
|
|||
|
прогер Профиль Группа: Участник Сообщений: 14 Регистрация: 22.6.2011 Репутация: нет Всего: нет |
Да, да. Именно это я и хочу. Я так это себе и представлял. Ну так весь вопрос был как посмотреть в эту таблицу маршрутизации? Я думаю лучше сразу смотреть в таблицу маршрутизации и если его там нет, слать широковещательный пакет типа - у кого ip. Весь нет перерыл и так и не нашел как туда смотреть. Нашел только как добавлять и убирать записи от туда (с помощью ioctl). |
|||
|
||||
| fish9370 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
/proc/net/route
где, destenation = 00000000, mask = 000000000 - это дефолтный маршрут gateway соответственно во внутреннем представлении айпишника..
нет, так лучше не делать, иначе ты не узнаешь, что машина находится не за шлюзом, а рядом.. и такой пакет не дойдет до назначения.. -------------------- undefined |
||||||
|
|||||||
| slavayo7777 |
|
||||||
|
прогер Профиль Группа: Участник Сообщений: 14 Регистрация: 22.6.2011 Репутация: нет Всего: нет |
про шеловскую команду route я знаю ты предлагаешь делать шеловский вызов, а потом парсить stdout в программе и от туда выковыривать маршрут? нет ли другого способа, какими нибудь вызовами достать эту информацию? идеально было бы что нить типа функции, которая возвращает правильный маршрут, если укажешь ей нужный айпишник.
ну например: 1. сервер находится в моей подсети без шлюза: я смотрю в таблицу маршрутизацию и узнаю, что к серверу можно стучаться напрямую, отправляю ARP, узнаю мак сервера. 2. сервер находится не в моей подсети за шлюзом: я смотрю в таблицу маршрутизацию и узнаю, что к серверу можно стучаться через шлюз, отправляю ARP, узнаю мак шлюза. ты же предлагаешь отправлять арп запрос, ждать пока ответят, если не ответят, смотреть таблицу и слать арп шлюзу. на ожидание тратится время, причем довольно большое (относительно времени для лишнего просмотра таблицы) |
||||||
|
|||||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
тогда я предлагаю, еще усовершенствовать метод, и смотреть сначала в арп-таблицу (это избавит нас от лишнего широковещательного запроса) что касается proc, то это не совсем шелл-метод.. хотя я с тобой согласен системный вызов, было бы получше.. поищем.. -------------------- undefined |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 20 Всего: 223 |
||||
|
||||
| slavayo7777 |
|
|||
|
прогер Профиль Группа: Участник Сообщений: 14 Регистрация: 22.6.2011 Репутация: нет Всего: нет |
Вот оно чо!! Спасибо!!! блин, все так просто оказываеца)) если есть конечно путь попроще, типа функции, которая автоматом выдает маршрут, было бы неплохо... |
|||
|
||||
| fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 2 Всего: 1 |
я думал, ты это понял.. вот еще интерфейс для получения arp-таблицы /proc/net/arp -------------------- undefined |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |