| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > ARP запрос через socket, учитывая routing table |
| Автор: slavayo7777 22.6.2011, 14:57 | ||||
| Добрый день. Уже замучался рыть в интернете. Может подскажите... В моем устройстве необходимо узнать мак адресс узла, 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 22.6.2011, 15:43 |
| хотя, если ты настроишь на маршрутизаторе (шлюзе) proxyarp.. то впринципе можно.. но это не по-дефолту в любом случае.. |
| Автор: slavayo7777 22.6.2011, 15:46 | ||
Я наверное неправильно выразился. Мне не нужен мак адресс конечного узла. Мне нужно узнать мак шлюза, чтобы слать через него пакеты на сервер. Моей программе заранее не известно, через что она работает: напрямую с сервером или через шлюз. Ну так вот, не охото добавлять в программу дополнительную настройку шлюза, хочется чтобы прописав маршрут в route, она могла сама понять, через что ей работать. И из настроек в программе был бы только IP сервера. А как до последнего дойдут пакеты, будет решать ОС. |
| Автор: fish9370 22.6.2011, 15:52 |
это вопрос маршрутизиции, зачем связываться с канальным уровнем? почему не работать на сетевом? |
| Автор: slavayo7777 22.6.2011, 16:08 | ||
Как тогда сделать ARP запрос на сетевом уровне? В общем, задача узнать мак адресс шлюза, чтобы слать пакеты. |
| Автор: fish9370 22.6.2011, 16:27 |
на сетевом уровне ARP'а нет, там есть IP.. вообще слать пакеты ты хочешь куда? на шлюз или на целевую машину за шлюзом? |
| Автор: fish9370 22.6.2011, 16:55 |
| я понял, что ты хочешь (мне кажется, что понял).. ну тогда схема такая: посылаешь широковещательный пакет типа - у кого ip = xxx.xxx.xxx.xxx, ловишь ответ если ответ получен, значит машина в твоей подсети и можно слать пакет по тому маку, который получен иначе посылаешь широковещательный запрос - у кого ip = ipшлюза (его ip берешь из таблицы маршрутизации), ловишь ответ если ответ получен направляешь пакет по тому маку |
| Автор: slavayo7777 23.6.2011, 07:04 | ||
Да, да. Именно это я и хочу. Я так это себе и представлял. Ну так весь вопрос был как посмотреть в эту таблицу маршрутизации? Я думаю лучше сразу смотреть в таблицу маршрутизации и если его там нет, слать широковещательный пакет типа - у кого ip. Весь нет перерыл и так и не нашел как туда смотреть. Нашел только как добавлять и убирать записи от туда (с помощью ioctl). |
| Автор: fish9370 23.6.2011, 09:49 | ||||||
/proc/net/route
где, destenation = 00000000, mask = 000000000 - это дефолтный маршрут gateway соответственно во внутреннем представлении айпишника..
нет, так лучше не делать, иначе ты не узнаешь, что машина находится не за шлюзом, а рядом.. и такой пакет не дойдет до назначения.. |
| Автор: slavayo7777 23.6.2011, 10:18 | ||||||
про шеловскую команду route я знаю ты предлагаешь делать шеловский вызов, а потом парсить stdout в программе и от туда выковыривать маршрут? нет ли другого способа, какими нибудь вызовами достать эту информацию? идеально было бы что нить типа функции, которая возвращает правильный маршрут, если укажешь ей нужный айпишник.
ну например: 1. сервер находится в моей подсети без шлюза: я смотрю в таблицу маршрутизацию и узнаю, что к серверу можно стучаться напрямую, отправляю ARP, узнаю мак сервера. 2. сервер находится не в моей подсети за шлюзом: я смотрю в таблицу маршрутизацию и узнаю, что к серверу можно стучаться через шлюз, отправляю ARP, узнаю мак шлюза. ты же предлагаешь отправлять арп запрос, ждать пока ответят, если не ответят, смотреть таблицу и слать арп шлюзу. на ожидание тратится время, причем довольно большое (относительно времени для лишнего просмотра таблицы) |
| Автор: fish9370 23.6.2011, 10:37 | ||
тогда я предлагаю, еще усовершенствовать метод, и смотреть сначала в арп-таблицу (это избавит нас от лишнего широковещательного запроса) что касается proc, то это не совсем шелл-метод.. хотя я с тобой согласен системный вызов, было бы получше.. поищем.. |
| Автор: xvr 23.6.2011, 10:49 |
Это не шеловская команда, это файл такой - /proc/net/route. Открываешь его fopen'ом и читаешь построчно |
| Автор: slavayo7777 23.6.2011, 11:00 | ||
Вот оно чо!! Спасибо!!! блин, все так просто оказываеца)) если есть конечно путь попроще, типа функции, которая автоматом выдает маршрут, было бы неплохо... |
| Автор: fish9370 23.6.2011, 11:04 |
я думал, ты это понял.. вот еще интерфейс для получения arp-таблицы /proc/net/arp |
| Автор: slavayo7777 23.6.2011, 11:15 | ||
Спасибо. Пойду писать парсеры для этих файлов. Думаю, вопрос можно пометить решенным. Хотя конечно вдруг кто вспомнит функцию или вызов, которые исходя из таблицы возвращают айпишник, буду очень рад. Ну или может, кто то уже делал такой парсер и выложит код... Всем большое спасибо!! |
| Автор: slavayo7777 23.6.2011, 15:00 | ||
Вот сделал парсер, который возвращает адресс гейтвея, если он прописан (если кому надо). Взял за основу net-tools
|
| Автор: fish9370 23.6.2011, 21:16 |
| неплохой код.. спасибо.. мне аж захотелось поделиться с тобой своим парсером.. |
| Автор: slavayo7777 24.6.2011, 07:57 | ||
ну так делись |
| Автор: fish9370 24.6.2011, 10:17 | ||
здесь не все декларации, если есть вопросы - добро пожаловать в мою учебную помойку http://79.120.100.108/mifi/ файл называется test/gateway.c |
| Автор: slavayo7777 27.6.2011, 13:13 | ||||||
хреновый однако парсер я сделал)) ошибочка вышла небольшая, но эт не страшно. с несколькими маршрутами гейтвеев мой парсер отказался работать, исправил:
у меня были бурные выходные, потому только начинаю работать) спасибо за приглашение... может я еще чего то найду интересного. |