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

В Linux: как я могу программным образом определить, включен ли интерфейс NIC и подключен?

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

  • открыть AF_NETLINK сокет
  • привяжите его к sockaddr_nl с помощью nl_groups = RTMGRP_LINK
  • отправить сообщение RTM_GETLINK в ядро ​​
  • сделать опрос /epoll on socket для чтения сообщений RTM_NEWLINK и RTM_DELLINK
  • вы получите список начальных интерфейсов и его изменения в будущем.

Ответ 4

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

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

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

Ответ 5

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