Как сканировать wifi сети на ubuntu (c++)? Добрый день!
Решил на досуге изучать c/c++. Hello World уже написан, и хочется задачку поинтереснее.
К примеру сейчас хочу набросать программку, которая будет сканировать и выводить доступные wi-fi сети.
Подскажите в какую сторону искать?
На данный момент нашел библиотеку Wireless Tools и пример ее использования
но не удалось ее скомпилировать: main.cpp:12: undefined reference to `iw_sockets_open'#include
#include "libs/wireless_tools.29/iwlib.h"
int main() {
std::cout b.essid);
result = result->next;
}
exit(0);
}
Прошу толкните меня в нужном направлении))

21 Авг 2019 в 06:32
236 +1
0
Ответы
1

Для сканирования Wi-Fi сетей на Ubuntu с использованием C++, вы можете использовать библиотеку libnl (Netlink library).

Вот пример программы на C++, использующей libnl для сканирования Wi-Fi сетей и вывода их ESSID (имя сети):

#include <iostream>
#include <netlink/netlink.h>
#include <netlink/genl/genl.h>
#include <netlink/genl/ctrl.h>
#include <linux/nl80211.h>
int main() {
nl_sock* socket = nl_socket_alloc(); // Создаем сокет
genl_connect(socket); // Подключаемся к Generic Netlink
int family_id = genl_ctrl_resolve(socket, "nl80211"); // Получаем идентификатор семейства nl80211
nl_msg* msg = nlmsg_alloc(); // Создаем сообщение
genlmsg_put(msg, NL_AUTO_PID, NL_AUTO_SEQ, family_id, 0, NLM_F_DUMP, NL80211_CMD_GET_SCAN, 0); // Формируем запрос сканирования
nl_send_auto(socket, msg); // Отправляем запрос
nlmsg_free(msg); // Освобождаем сообщение
nl_cb* cb = nl_cb_alloc(NL_CB_DEFAULT); // Создаем callback
std::vector<std::string> essids; // Вектор для хранения ESSID
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, [](nl_msg* msg, void* essids) -> int {
struct nlattr* attrs[NL80211_ATTR_MAX + 1];
nla_parse(attrs, NL80211_ATTR_MAX, genlmsg_attrdata(nlmsg_hdr(msg), 0), genlmsg_attrlen(nlmsg_hdr(msg), 0), NULL);
if (attrs[NL80211_ATTR_SSID]) {
std::string essid = reinterpret_cast<char *>(nla_data(attrs[NL80211_ATTR_SSID]));
static_cast<std::vector<std::string>*>(essids)->push_back(essid);
}
return NL_SKIP;
}, &essids);
nl_recvmsgs(socket, cb); // Принимаем сообщения
for (const auto& essid : essids) {
std::cout << essid << std::endl; // Выводим ESSID
}
nl_cb_put(cb); // Освобождаем callback
nl_socket_free(socket); // Освобождаем сокет
return 0;
}

Для компиляции кода вы можете использовать команду:

g++ -o wifi_scan wifi_scan.cpp -lnl-3 -lnl-genl-3

Пожалуйста, помните, что для успешного выполнения кода вам потребуются права суперпользователя (sudo). И, конечно, проверьте, что у вас установлены все необходимые пакеты, включая libnl.

Надеюсь, этот пример поможет вам начать изучение C++ и погружение в работу с Wi-Fi на Ubuntu. Удачи!

20 Апр в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 028 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир