Как я могу получить список доступных беспроводных сетей в Linux?
Я хотел бы получить список доступных беспроводных сетей. В идеале это может быть через какой-то вызов C, но я не возражаю, если мне придется его убить системным вызовом. Еще лучше, если требуемый вызов или программа C не требует какого-либо экзотического пакета сторонних разработчиков.
В Интернете кажется, что я использую sudo iwlist <interface> scan
, который, похоже, делает трюк из командной строки, но я бы предпочел не требовать прав root. Я только хочу видеть основы, ничего не меняя.
Ответы
Ответ 1
Пакет Wireless Tools - iwlist - часть - также содержит библиотеку помощников беспроводных инструментов. Вам нужно включить iwlib.h и связать с libiw.a (т.е. Add -liw). Затем найдите документацию для функции iw_set_ext. Параметр SIOCSIWSCAN будет наиболее полезен. Пример использования этого интерфейса см. В источнике KWifiManager в библиотеке KDE (см. Метод Interface_wireless_wirelessextensions:: get_available_networks). Кроме того, вы также можете скачать Исходный код беспроводных инструментов и посмотреть, как функция iwlib iw_set_ext также используется для сканирования в iwlist.c.
Что касается привилегий, я полагаю, что для выполнения сканирования процесс должен выполняться как root. Мне бы очень хотелось узнать, можно ли это сделать иначе.
Поскольку вы используете Ubuntu 8.04, пакет libiw-dev должен быть полезен.
Ответ 2
Очень легко выполнить сканирование в командной строке. Страницы руководства - ваш друг здесь (проверьте iwconfig и iwlist). Но использование интерфейса C немного сложнее, поэтому я сосредоточусь на этом.
Прежде всего, как отмечали другие люди, определенно загрузите исходный код беспроводных инструментов. Вся документация для интерфейса программирования находится в файлах .c. Насколько я могу судить, нет никакой веб-документации для api. Однако исходный код довольно легко прочитать. Для этого вопроса вам понадобится iwlib.h и iwlib.c.
В то время как вы можете использовать iw_set_ext
и iw_get_ext
, libiw реализует базовую функцию сканирования 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!