Я хочу определить, включена ли сетевая карта, вставлена и подключена. В принципе, я хочу знать, будет ли сетевая карта работать. Мне нужна эта информация с помощью программы на С++ и вы хотите отобразить сообщение об ошибке, когда сеть работает неправильно. Если возможно, я бы хотел избежать использования команд оболочки для определения этой информации.
В Linux: как я могу программным образом определить, включен ли интерфейс NIC и подключен?
Ответ 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
для уведомлений об изменениях интерфейса.