Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Параметры:

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

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

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