Получать уведомления об изменении сетевого интерфейса в Linux - PullRequest
14 голосов
/ 14 февраля 2010

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

Ответы [ 4 ]

21 голосов
/ 14 февраля 2010

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

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

7 голосов
/ 14 февраля 2010

Параметры:

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

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

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

0 голосов
/ 14 февраля 2010

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

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

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

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

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

0 голосов
/ 14 февраля 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...