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