36

我想获得可用无线网络的列表。理想情况下,这将是通过一些 C 调用,但我不介意是否必须通过系统调用来解决它。如果所需的 C 调用或程序不需要某些特殊的 3rd 方包,那就更好了。

互联网似乎建议我使用sudo iwlist <interface> scanwhich 似乎确实可以从命令行解决问题,但我宁愿不需要 root 权限。我只想看到基础,不想改变任何东西。

4

3 回答 3

39

在命令行中进行扫描非常容易。手册页是您的朋友(查看iwconfigiwlist)。但是使用 C 接口有点困难,所以我将重点介绍这一点。

首先,正如其他人提到的,一定要下载无线工具源代码。编程接口的所有文档都在.c文件中。据我所知,该 api 没有网络文档。但是,源代码很容易阅读。对于这个问题,您几乎只需要iwlib.hiwlib.c 。

虽然您可以使用iw_set_extand 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);
}

免责声明:这只是一个演示程序。某些结果可能没有 essid。此外,这假设您的无线接口是“wlan0”。你明白了。

阅读iwlib源代码!

于 2013-05-25T18:55:11.063 回答
28

无线工具包(iwlist其中的一部分)还包含无线工具帮助程序库。您需要包含iwlib.h并与libiw.a链接(即添加 -liw)。然后查找iw_set_ext函数的文档。SIOCSIWSCAN参数最有用有关如何使用此接口的示例,请查看 KDE 库中的 KWifiManager 源代码(请参阅:Interface_wireless_wirelessextensions::get_available_networks方法)。或者,您也可以下载Wireless Tools 源代码并查看 iwlib iw_set_ext 函数如何在 iwlist.c 中用于扫描。

至于特权,我想该进程将需要以 root 身份运行才能执行扫描。我很想知道是否也可以这样做。

由于您使用的是 Ubuntu 8.04,因此应该使用libiw-dev软件包。

于 2008-12-30T14:39:37.323 回答
3

您可以使用nmcli不需要root权限或WIFI接口名称的。

nmcli -t -f ssid dev wifi
于 2019-11-28T23:23:56.710 回答