Как я могу получить список доступных беспроводных сетей в Linux?
Вопрос
Я хотел бы получить список доступных беспроводных сетей.В идеале это было бы через какой-нибудь вызов C, но я не против, если мне придется засорять это системным вызовом.Еще лучше, если требуемый вызов или программа C не требует какого-либо экзотического стороннего пакета.
Кажется, Интернет предлагает мне использовать sudo iwlist <interface> scan
что, похоже, помогает из командной строки, но я бы предпочел не требовать прав root.Я хочу только увидеть основы, ничего не менять.
Решение
А Беспроводные инструменты пакет -- из них iwlist является частью - также содержит вспомогательную библиотеку беспроводных инструментов.Вам нужно включить iwlib.h и связать с libiw.a (т.е.добавьте -liw).Затем найдите документацию для iw_set_ext функция.А СИОКСИВСКАН параметр будет наиболее полезным.Пример использования этого интерфейса можно найти в исходном коде KWifiManager в библиотеке KDE (см.: Interface_wireless_wirelessextensions::get_available_networks метод).Кроме того, вы также можете скачать Исходный код беспроводных инструментов и посмотрите, как функция iwlib iw_set_ext также используется для сканирования в iwlist.c.
Что касается привилегий, я полагаю, что для выполнения сканирования процесс должен быть запущен от имени пользователя root.Мне хотелось бы знать, можно ли это сделать иным образом.
Поскольку вы используете Ubuntu 8.04, libiw-dev пакет должен быть полезным.
Другие советы
Выполнить сканирование в командной строке довольно легко.Страницы руководства здесь вам в помощь (см. iwconfig и iwlist).Но использовать интерфейс C немного сложнее, поэтому я сосредоточусь на этом.
Прежде всего, как уже упоминали другие люди, обязательно скачайте исходный код беспроводных инструментов.Вся документация по программному интерфейсу находится в папке .с файлы.Насколько я могу судить, веб-документации по API нет.Однако исходный код довольно легко читается.Вам нужно всего лишь iwlib.h и iwlib.c для этого вопроса.
Пока вы можете использовать iw_set_ext
и iw_get_ext
, либив реализует базовую функцию сканирования iw_scan
, из которого вы сможете извлечь большую часть необходимой вам информации.
Вот простая программа для получения ESSID для всех доступных беспроводных сетей.Скомпилировать с -liw
и бежать с sudo
.
#include <stdio.h>
#include <time.h>
#include <iwlib.h>
int main(void) {
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, "wlan0", range.we_version_compiled, &head) < 0) {
printf("Error during iw_scan. Aborting.\n");
exit(2);
}
/* Traverse the results */
result = head.result;
while (NULL != result) {
printf("%s\n", result->b.essid);
result = result->next;
}
exit(0);
}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:Это всего лишь демонстрационная программа.Некоторые результаты могут не иметь эссида.Кроме того, предполагается, что ваш беспроводной интерфейс — «wlan0».Вы поняли идею.
Прочтите iwlib исходный код!