В Linux: как программно определить, включен ли интерфейс NIC и включен ли он? - PullRequest
16 голосов
/ 10 июля 2010

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

Ответы [ 5 ]

16 голосов
/ 10 июля 2010

Вы можете посмотреть на /sys/class/net/eth0/operstate, где eth0 - ваш интерфейс, чтобы увидеть, работает ли он.

Посмотрите на /sys/class/net/eth0/carrier, чтобы увидеть, есть ли перевозчик.

Хотя я думаю, что выполнение ifconfig и друзья обеспечат вам большую совместимость с * BSD.

5 голосов
/ 13 июля 2013
  1. открыть AF_NETLINK сокет
  2. связать его с sockaddr_nl с nl_groups = RTMGRP_LINK
  3. отправить сообщение RTM_GETLINK в ядро ​​
  4. сделать опрос / epollна сокете для чтения RTM_NEWLINK и RTM_DELLINK сообщений
  5. вы получите начальный список интерфейсов и его изменения в будущем
4 голосов
/ 10 июля 2010

Помните, что в Linux "все" - это файл.

Лучшим способом было бы использовать одобренное ядро ​​<-> взаимодействия с пространством пользователя, а именно sysfs, смонтированное в /sys.Сетевые устройства связаны на /sys/class/net

Если вы хотите использовать интерфейс ioctl, посмотрите на man netdevice

1 голос
/ 31 июля 2010

Выполните вывод getifaddrs, вы можете использовать канальный уровень для MAC-адреса, чтобы идентифицировать адаптер и проверить ifa_flags для IFF_UP.Используйте AF_NETLINK для уведомлений об изменениях интерфейса.

1 голос
/ 10 июля 2010

Как вы хотите идентифицировать сетевую карту? Вы можете попробовать взглянуть на /etc/udev/rules.d/70-persistent-net.rules, который отображает аппаратные MAC-адреса в хорошие имена (например, eth0).

Затем, когда у вас есть более подходящее имя, вы можете запустить такие вещи, как ethtool eth0, чтобы определить, подключено ли оно [физически] (последняя строка), ifconfig eth0, чтобы определить, работает ли оно (ищите "UP BROADCAST. .. "), и если у него есть IP-адрес.

Я готов предположить, что для этого есть автоматические библиотеки; ты смотрел вокруг? Я не уверен, есть ли в NetworkManager легко доступный код, но это должно быть хорошим первым местом для поиска.

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