Задача: получить список сетевых интерфейсов на машине и информацию о каждом из них.
Все интерфейсы для работы с сетью 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.
|
|
Webmoney Z163628999150, R617151845974
|
5:39
Спасибо. Этого примера мне и не хватало, чтобы встроить в свою программу просмотр сведений об интерфейсе.
Теперь пойду искать пример трассировки маршрута