我想获得可用无线网络的列表。理想情况下,这将是通过一些 C 调用,但我不介意是否必须通过系统调用来解决它。如果所需的 C 调用或程序不需要某些特殊的 3rd 方包,那就更好了。
互联网似乎建议我使用sudo iwlist <interface> scan
which 似乎确实可以从命令行解决问题,但我宁愿不需要 root 权限。我只想看到基础,不想改变任何东西。
在命令行中进行扫描非常容易。手册页是您的朋友(查看iwconfig和iwlist)。但是使用 C 接口有点困难,所以我将重点介绍这一点。
首先,正如其他人提到的,一定要下载无线工具源代码。编程接口的所有文档都在.c文件中。据我所知,该 api 没有网络文档。但是,源代码很容易阅读。对于这个问题,您几乎只需要iwlib.h和iwlib.c 。
虽然您可以使用iw_set_ext
and 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源代码!
无线工具包(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软件包。
您可以使用nmcli
不需要root权限或WIFI接口名称的。
nmcli -t -f ssid dev wifi