Будьте уведомлены об изменении сетевого интерфейса на Linux

Мне нужен способ уведомить мое приложение пространства пользователя, когда сетевой интерфейс включен или отключен. Я надеюсь сделать это, не обращаясь к опросу. Ядро предлагает своего рода рычаг для инициирования функций обратного вызова, когда связанные с сетью события имеют место?

15
задан live2dream95 14 February 2010 в 16:22
поделиться

4 ответа

Я полагаю, что средство netlink (man 7 netlink) предоставляет информацию о сетевых интерфейсах через семейство NETLINK_ROUTE (man 7 rtnetlink). Возможно, вы сможете select() или poll() на сокете netlink для получения нужной вам информации. Однако я не уверен в этом; я сам не использовал это.

На более высоком уровне, если в системе запущен NetworkManager, он будет транслировать события через D-Bus при изменении сетевого статуса системы. Браузер Epiphany использует эти события, например, для автоматической активации режима "Работа в автономном режиме", когда система теряет сетевое соединение, и переключения обратно в онлайн-режим, когда сетевое соединение возобновляется. Существуют клиентские библиотеки D-Bus для различных языков, и они менее привязаны к конкретной платформе, чем netlink, поэтому я бы рекомендовал использовать именно их.

22
ответ дан 1 December 2019 в 02:19
поделиться

Почему бы не сделать fork в коде, используя popen для выполнения любого из этих действий:

  • выдать tail -f /var/log/messages для поиска eth* интерфейсов
  • выдать ifconfig для просмотра списка адаптеров, идущих вверх или вниз

и разобрать данные с помощью pregex, сделать sleep() на некоторое время и перепроверить снова. . Или вы можете просмотреть системный журнал, используя функции 'syslog.h'.

Если вы будете придерживаться стандарта Posix, код будет переносимым в различных версиях Unix/Linux/BSD...

-1
ответ дан 1 December 2019 в 02:19
поделиться

Параметры:

  • ifplugd запустит сценарий по вашему выбору, когда кабель подключен к сетевому интерфейсу или отключен от него.

  • Если вы используете Debian, вы можете добавить сценарий в подкаталоги / etc / network , где есть сценарии, которые запускаются каждый раз, когда интерфейс отключается или отключается.

  • Если ни один из вышеперечисленных вариантов не подходит для ваших нужд, обратитесь к D-Bus . Мне никогда не удавалось успешно использовать его, но это то, для чего он был разработан.

8
ответ дан 1 December 2019 в 02:19
поделиться

Без опроса или полагаясь на хуки ОС, как предложил Norman Ramsey, ваш единственный вариант - периодически сверять рабочий интерфейс с тем, что было несколько секунд назад. Это приводит только к аду очереди событий / rx / tx, если идея состоит в том, чтобы ставить в очередь / блокировать ожидание болтовни, когда связь недоступна.

Кроме того, скрипты Debian работают в сочетании со скриптами init, крючки, которые они предоставляют, не скажут вам, использовал ли root ifconfig для отключения или изменения настроенного интерфейса, или настроил новый интерфейс, который не был описан в init. Они скажут вам только, сделал ли пользователь что-то через /etc/init.d/networking, или сделал ли init то же самое.

Что такого ужасно убогого в запуске потока для опроса изменений?

Если коротко, то да, вы можете запустить процесс 'netnicmond', который сигнализирует списку подписчиков, чтобы сообщить им, что что-то изменилось, или более сложный процесс, который действительно передает изменения. Вероятно, для этого вы бы использовали netlink...

А вы не думали просто использовать netlink?

0
ответ дан 1 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: