Как сканировать 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); } Прошу толкните меня в нужном направлении))
Для компиляции кода вы можете использовать команду:
g++ -o wifi_scan wifi_scan.cpp -lnl-3 -lnl-genl-3
Пожалуйста, помните, что для успешного выполнения кода вам потребуются права суперпользователя sudosudosudo. И, конечно, проверьте, что у вас установлены все необходимые пакеты, включая libnl.
Надеюсь, этот пример поможет вам начать изучение C++ и погружение в работу с Wi-Fi на Ubuntu. Удачи!
Для сканирования 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. Удачи!