Получение информации о сетевых интерфейсах средствами Qt

Категория: C / C++ , Qt Комментариев: 1

Задача: получить список сетевых интерфейсов на машине и информацию о каждом из них.

Все интерфейсы для работы с сетью Qt хранит в модуле QtNetwork.
Для получения списка зарегистрированных в системе сетевых интерфейсов воспользуемся методом allInterfaces () класса QNetworkInterface:

QList<QNetworkInterface> list = QNetworkInterface::allInterfaces();

Этот метод возвращает список Qlist элементов QNetworkInterface. Вот этот класс и представляет данные об определенном сетевом интерфейсе, а именно: имя интерфейса, физический адрес устройства (MAC-адрес), IP-адреса, закрепленные за интерфейсом.
Помимо полного списка сетевых интерфейсов можно получить информацию о конкретном интерфейсе с помощью методов QNetworkInterface::interfaceFromIndex (int index) и QNetworkInterface::interfaceFromName (const QString &name).
Рассмотрим подробней предоставляемые классом QNetworkInterface данные о сетевых интерфейсах.
Для получения имени сетевого интерфейса служит метод QNetworkInterface::name (). В Unix-системах он возвращает строку, содержащую тип сетевого интерфейса и его номер (например eth0", «lo», «pcn0»). В Windows-системах он вернет внутренний ID интерфейса. Также в Windows-системах можно использовать метод QNetworkInterface::humanReadableName (), который возвращает удобочитаемое имя сетевого интерфейса, например «Подключение по локальной сети». Если понятное человеку имя для интерфейса не определено, то этот метод вернет то же самое, что и метод name (). В Unix-системах информация о удобоваримом имени интерфейса не предоставляется, поэтому этот метод всегда возвращает то же самое, что и метод name ().

qDebug() << QString::fromUtf8("Название - %1").arg((iface.name() == iface.humanReadableName()) ? iface.name() : iface.humanReadableName());
qDebug() << QString::fromUtf8("Название - %1").arg(iface.name());

Получить физический адрес оборудования, используемого сетевым интерфейсом, можно с помощью метода QNetworkInterface::hardwareAddress (). Применительно к Ethernet этот метод должен вернуть MAC-адрес сетевой карты, разделенный двоеточиями. Другие сетевые интерфейсы тоже могут меть некие аналоги MAC-адресов, которые и будет возвращать метод.

qDebug() << iface.hardwareAddress();

Для получения списка IP-адресов, закрепленных за интерфейсом, используется метод QNetworkInterface::addressEntries (). Он возвращает список Qlist элементов QNetworkAddressEntry, которые предназначены для хранения IP-адресов сетевых интерфейсов и маски подсети.
Получиь IP-адрез из элемента можно с помощью метода QNetworkAddressEntry::ip (). Следует отметить, что он возвращает не строку с IP-адресом, а класс QHostAddress, который нужно преобразовать в сроку методом toString ():

foreach (QNetworkAddressEntry addr, iface.addressEntries())
qDebug() << addr.ip().toString();

Получить список флагов сетевого интерфейса можно с помощью метода QNetworkInterface::flags (). Он вернет список типа QFlags<InterfaceFlag>.
Прямого пути для просмотра содержимого этого списка нет. Единственное, что можно сделать — это по отдельности проверять факт входжения того или иного флага в список.

if (iface.flags().testFlag(QNetworkInterface::IsUp))
flags += "IsUp ";
if (iface.flags().testFlag(QNetworkInterface::IsRunning))
flags += "IsRunning ";

Флаги, которые могут присутствовать у сетевого соединения: QNetworkInterface::IsUp (поднято-ли сеодинение), QNetworkInterface::IsRunning (выделены-ли системные ресурсы под соединение), QNetworkInterface::CanBroadcast (поддерживает-ли интерфейс потоковое вещание), QNetworkInterface::IsLoopBack (является-ли интерфейс кольцевым), QNetworkInterface::IsPointToPoint (явсяется-ли соединение соединением типа точка-точка), QNetworkInterface::CanMulticast (поддерживает-ли интерфейс мультикастинг).

Скачать пример
Пока всё...
В ближайшее время постараюсь описать работу с сокетами в Qt. А пока можете подписаться на RSS, или Twitter.

Автор: Кто-то   @   23 марта 2010 Комментариев: 1
Метки : ,

Поблагодарить автора

Webmoney Z163628999150, R617151845974

Комментариев: 1

Комментарии
мая 15, 2010
5:39
#1 Alex :

Спасибо. Этого примера мне и не хватало, чтобы встроить в свою программу просмотр сведений об интерфейсе. :)

Теперь пойду искать пример трассировки маршрута :roll:

оставить комментарий

Предыдущая запись
«
Следующая запись
»