Как я могу получить список доступных беспроводных сетей в Linux?

StackOverflow https://stackoverflow.com/questions/400240

  •  03-07-2019
  •  | 
  •  

Вопрос

Я хотел бы получить список доступных беспроводных сетей.В идеале это было бы через какой-нибудь вызов 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 исходный код!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top