Подтвердить что ты не робот

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

Я хотел бы получить список доступных беспроводных сетей. В идеале это может быть через какой-то вызов C, но я не возражаю, если мне придется его убить системным вызовом. Еще лучше, если требуемый вызов или программа C не требует какого-либо экзотического пакета сторонних разработчиков.

В Интернете кажется, что я использую sudo iwlist <interface> scan, который, похоже, делает трюк из командной строки, но я бы предпочел не требовать прав root. Я только хочу видеть основы, ничего не меняя.

4b9b3361

Ответ 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!