我想获得可用无线网络的列表。理想情况下,这将通过一些C调用,但我不介意是否必须通过系统调用来修改它。如果所需的C调用或程序不需要一些奇特的第三方软件包,那更好。如何获得Linux上的可用无线网络列表?
互联网似乎暗示我使用sudo iwlist <interface> scan
似乎从命令行做伎俩,但我宁愿不需要root权限。我只想看到基础知识,不会改变任何事情。
我想获得可用无线网络的列表。理想情况下,这将通过一些C调用,但我不介意是否必须通过系统调用来修改它。如果所需的C调用或程序不需要一些奇特的第三方软件包,那更好。如何获得Linux上的可用无线网络列表?
互联网似乎暗示我使用sudo iwlist <interface> scan
似乎从命令行做伎俩,但我宁愿不需要root权限。我只想看到基础知识,不会改变任何事情。
Wireless Tools包 - 其中iwlist是一部分 - 也包含无线工具助手库。您需要包含iwlib.h并链接到libiw.a(即添加-liw)。然后查找iw_set_ext函数的文档。参数将是最常用的。有关如何使用此接口的示例,请查看KDE库中的KWifiManager源代码(请参阅:Interface_wireless_wirelessextensions::get_available_networks方法)。或者,您也可以下载Wireless Tools source code并查看iwlist.c中iwlset iw_set_ext函数是如何用于扫描的。
至于特权,我想过程将需要以root身份运行以执行扫描。我很想知道这是否可以以其他方式完成。
由于您使用的是Ubuntu 8.04,因此应该使用libiw-dev软件包。
我可以在商业应用程序中使用** Wirelsess Tool **包(** libiw-dev **)吗?可能我不能,但我想确定。 – rraszewski 2014-09-04 10:11:32
在命令行中执行扫描非常简单。手册页是你的朋友在这里(检查出iwconfig和iwlist)。但是使用C接口有点困难,所以我会专注于此。
首先,正如其他人所提到的,绝对要下载出wireless tools source code。编程接口的所有文档位于.c文件中。据我所知,这个API没有web文档。但是,源代码很容易阅读。你几乎只需要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);
}
免责声明:这只是一个演示程序。某些结果可能没有essid。另外,这假设你的无线接口是“wlan0”。你明白了。
阅读iwlib源代码!
您不需要root就可以运行iwlist,但它只会报告上次定期扫描的缓存值。要强制进行新的扫描,您需要成为root用户。 – Hudson 2008-12-30 15:02:16
嗯,当运行非root用户时,至少在Ubuntu 8上不会返回任何内容。04: -/ – richq 2008-12-30 15:21:55