Как сканировать 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 << "Hello, World!" << std::endl;
wireless_scan_head head;
wireless_scan *result;
iwrange range;
int sock;
/* Open socket to kernel */
sock = iw_sockets_open();
/* Get some metadata to use for scanning */
if (iw_get_range_info(sock, "wlan0", &range) < 0) {
printf("Error during iw_get_range_info. Aborting.\n");
exit(2);
}
/* Perform the scan */
if (iw_scan(sock, (char *) "wlan0", range.we_version_compiled, &head) b.essid);
result = result->next;
}
exit(0);
}
Прошу толкните меня в нужном направлении))

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

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

Вот пример программы на 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_connectsocketsocketsocket; // Подключаемся к Generic Netlink
int family_id = genl_ctrl_resolvesocket,"nl80211"socket, "nl80211"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_autosocket,msgsocket, msgsocket,msg; // Отправляем запрос
nlmsg_freemsgmsgmsg; // Освобождаем сообщение
nl_cb* cb = nl_cb_allocNLCBDEFAULTNL_CB_DEFAULTNLC BD EFAULT; // Создаем 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_recvmsgssocket,cbsocket, cbsocket,cb; // Принимаем сообщения
for (const auto& essid : essids) {
std::cout << essid << std::endl; // Выводим ESSID
}
nl_cb_putcbcbcb; // Освобождаем callback
nl_socket_freesocketsocketsocket; // Освобождаем сокет
return 0;
}

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

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

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

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

20 Апр 2024 в 13:16
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир