Проверка наличия PPPoE-сервера в сети

Для неординарных вопросов. Если вы опытный программист, попавший в трудную ситуацию, — вам сюда.

Модератор: gaidar

Правила форума
Этот раздел не предназначен для того, чтобы вы адресовали свою проблему профессионалам.
Этот раздел предназначен для профессионалов, которые столкнулись с проблемой и не могут решить ее самостоятельно.
Если вы считаете себя профессионалом, а свою проблему сложной — вам сюда.
Если модератор посчитает, что вы ошиблись, то на первый раз он перенесет ваше сообщение в основной раздел без последствий для автора. Во второй раз тема будет закрыта, а автору будет выписано нарушение. В третий раз автор будет забанен.
EducatedFool
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 21.02.2009 (Сб) 10:30
Откуда: Россия, Урал

Проверка наличия PPPoE-сервера в сети

Сообщение EducatedFool » 01.06.2009 (Пн) 4:52

Столкнулся с такой проблемой:
Программа запускается на различных компах, которые могут быть подключены к различным локальным сетям (или не подключены ни к одной)
На компах могут присутствовать несколько сетевых адаптеров (в том числе и WiFi-адаптеры), некоторые из которых могут быть отключены.
Требуется проверить наличие подключения к определённой локальной сети (по которой программа будет управлять различными устройствами, установив на нужном сетевом интерфейсе необходимые IP-адреса)

Нужную сеть можно однозначно идентифицировать только по наличию в ней PPPoE-сервера (известны имя сервера и его MAC-адрес)
Впрочем, вероятность встретить PPPoE-сервер в других подсетях (VLAN-ах) равна нулю, так что достаточно просто проверить наличие ответа от PPPoE-сервера.
В идеале, требуется создать некую функцию, возвращающую значение типа Boolean, в зависимости от того, обнаружен ли ответ от PPPoe-сервера.
Поиски подходящего кода успехами не увенчались...
Ещё лучше, если функция будет возвращать имя (или другой параметр) сетевого адаптера, через который удалось достучаться до PPPoE-сервера, либо пустую строку при отсутствии ответа.
Подобные программы встречал - например, PPPoE Monitor (http://l2nt.info/), - но они требуют установки дополнительных компонентов (например, библиотеки WinPcap)
Хотелось бы реализовать данный функционал без использования дополнительных компонентов.

Как включить отключенные сетевые адаптеры - попробую разобраться сам (где-то находил примеры кода), а вот как сформировать PADI-пакет Ethernet, и получить ответный PADO, представления не имею.
Или, может, есть какая-то API-функция, которая сама отправит запрос, и возвратит ответ?

Если у кого-то есть полезные ссылки по теме, или куски кода (желательно на VB, конечно), - буду очень рад.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Проверка наличия PPPoE-сервера в сети

Сообщение alibek » 01.06.2009 (Пн) 8:07

Я бы советовал использовать WinPcap. Ниже четвертого уровня на VB ты не опустишься, во всяком случае стандартными методами.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Проверка наличия PPPoE-сервера в сети

Сообщение Денис » 01.06.2009 (Пн) 10:09

:idea:
Говоришь имена и адреса PPPoE-серверов известны?
Я бы сделал так: сделал список, файлом, например ini тот-же. Программа опрашивает сеть, если хотябы от одного элемента списка поступил ответ, значит мы находимся в нужной сети и действуем дальше, если нет, не действуем.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Проверка наличия PPPoE-сервера в сети

Сообщение alibek » 01.06.2009 (Пн) 10:15

Денис писал(а):Программа опрашивает сеть, если хотябы от одного элемента списка поступил ответ, значит мы находимся в нужной сети и действуем дальше, если нет, не действуем.

Каким образом?
Сервер, осуществляющий обслуживание PPPoE-сессий, не обязан отвечать на ICMP-запросы.
Lasciate ogni speranza, voi ch'entrate.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Проверка наличия PPPoE-сервера в сети

Сообщение Денис » 01.06.2009 (Пн) 10:59

ICMP - это широковещательный, да? тогда пинговать по адресу каждый элемент списка. если есть ответ от одного из них (а ответ должен быть именно от одного элемента, как я понимаю) то действуем далее.
Пинг-то для всех узлов обязателен? (если не установлен софт, типа того, который пытаются написать в соседнем разделе))
Если же и пинг, необязателен, то остается последняя возможность, ламерская, правда (но нам ведь важен результат?) опрашивать 80 порт. У всех ли PPPoE-серверов есть веб-интерфейс? Думаю - да.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Проверка наличия PPPoE-сервера в сети

Сообщение alibek » 01.06.2009 (Пн) 11:10

ICMP это не широковещательный. Это ICMP, которым также является и пинг. И он не обязателен.
Но если в icmp/8 есть хоть какой-то смысл, то подключение к tcp/80 — это глупость.
Lasciate ogni speranza, voi ch'entrate.

EducatedFool
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 10
Зарегистрирован: 21.02.2009 (Сб) 10:30
Откуда: Россия, Урал

Re: Проверка наличия PPPoE-сервера в сети

Сообщение EducatedFool » 01.06.2009 (Пн) 15:06

Денис писал(а):Говоришь имена и адреса PPPoE-серверов известны?
Программа опрашивает сеть, если хотябы от одного элемента списка поступил ответ, значит мы находимся в нужной сети и действуем дальше, если нет, не действуем.

Сервер-то всего один, так что даже ini-файл не нужен. MAC-адрес можно вшить к код, это не принципиально.
Проблема-то опросить сеть, и по возможности найти тот сетевой интерфейс, через который поступил ответ.

alibek писал(а):Ниже четвертого уровня на VB ты не опустишься, во всяком случае стандартными методами.

Очень жаль. Придётся поступить по-другому - создавать PPPoe-соединение средствами WinAPI, запускать созданное соединение, а потом проверять наличие Интернета (или проверять ответ системы на попытку подключения)
Не лучший вариант (кода много, не удастся узнать, через какой интерфейс пришел ответ, да и долгий этот процесс), но других способов не вижу.

alibek писал(а):Сервер, осуществляющий обслуживание PPPoE-сессий, не обязан отвечать на ICMP-запросы.

Про ICMP-запросы, конечно же, речь не идет. Даже если сервер бы и ответил.
К примеру, есть 3 сетевые карты, на каждой из них - свой IP-адрес.
Можно, конечно, каждому интерфейсу по очереди дописывать нужный IP-адрес, и пытаться пинговать какое-либо оборудование (тут помимо PPPoE-сервера есть что пинговать, да и готовый код для Ping-а уже есть), но тут есть 2 проблемы:
во-первых, это долго (да и надо потом затирать прописанные адреса),
во-вторых (и это главное), не из всех сегментов сети доступен ping (на некоторых коммутаторах рубится ICMP-трафик)

Денис писал(а):остается последняя возможность, ламерская, правда (но нам ведь важен результат?) опрашивать 80 порт. У всех ли PPPoE-серверов есть веб-интерфейс? Думаю - да.

Вопрос в другом. У всех ли этот порт открыт (в моём случае в роли PPPoE-сервера выступает Cisco)
Да и не факт, что сетевому интерфейсу PPPoE-сервера, смотрящему в сторону моей сети, вообще назначен какой-либо IP-адрес...


Вернуться в Раздел для Профессионалов

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList  
cron