我想得到一个可用的无线网络的列表。理想情况下,这将是通过一些C调用,但我不介意,如果我必须与系统调用组装它。如果所需的C调用或程序不需要一些异国情调的第三方软件包甚至更好。互联网上似乎建议我使用sudo iwlist <interface> scan,这似乎确实可以从命令行中做到这一点,但我宁愿不需要root权限。我只想看到基本的东西,而不是改变任何东西。
sudo iwlist <interface> scan
wribegjk1#
在命令行中进行扫描非常容易。手册页是你的朋友(查看iwconfig和iwlist)。但是使用C接口有点困难,所以我将重点放在这一点上。首先,正如其他人提到的,一定要下载无线工具的源代码。编程接口的所有文档都在**.c文件中。据我所知,没有API的Web文档。然而,源代码很容易阅读。对于这个问题,你几乎只需要iwlib.h和iwlib.c**。虽然您可以使用iw_set_ext和iw_get_ext,但libiw实现了基本的扫描函数iw_scan,您可以从中提取所需的大部分信息。这里有一个简单的程序,可以获取所有可用无线网络的ESSID。用-liw编译,用sudo运行。
iw_set_ext
iw_get_ext
iw_scan
-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);}
#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");
/* Traverse the results */
result = head.result;
while (NULL != result) {
printf("%s\n", result->b.essid);
result = result->next;
exit(0);
字符串免责声明:这只是一个演示程序。有些结果可能没有essid。另外,这假设你的无线接口是“wlan 0”。你明白的。阅读iwlib源代码!
mkh04yzy2#
Wireless Tools包(iwlist是其中的一部分)还包含一个Wireless Tools Helper Library。(即add -liw)。然后查找iw_set_ext函数的文档。SIOCSIWSCAN参数将是最常用的。有关如何使用此接口的示例,查看KDE库中的KWifiManager源代码(参见:Interface_wireless_wirelessextensions::get_available_networks方法)。或者,您也可以下载Wireless Tools source code并查看iwlib iw_set_ext函数如何用于iwlist. c中的扫描。至于特权,我想进程需要以root身份运行才能执行扫描。我想知道这是否也可以以其他方式完成。由于您使用的是Ubuntu 8.04,因此libiw-dev包应该有用。
hpcdzsge3#
您可以使用nmcli,它不需要root权限或WIFI接口名称。
nmcli
nmcli -t -f ssid dev wifi
字符串
3条答案
按热度按时间wribegjk1#
在命令行中进行扫描非常容易。手册页是你的朋友(查看iwconfig和iwlist)。但是使用C接口有点困难,所以我将重点放在这一点上。
首先,正如其他人提到的,一定要下载无线工具的源代码。编程接口的所有文档都在**.c文件中。据我所知,没有API的Web文档。然而,源代码很容易阅读。对于这个问题,你几乎只需要iwlib.h和iwlib.c**。
虽然您可以使用
iw_set_ext
和iw_get_ext
,但libiw实现了基本的扫描函数iw_scan
,您可以从中提取所需的大部分信息。这里有一个简单的程序,可以获取所有可用无线网络的ESSID。用
-liw
编译,用sudo
运行。字符串
免责声明:这只是一个演示程序。有些结果可能没有essid。另外,这假设你的无线接口是“wlan 0”。你明白的。
阅读iwlib源代码!
mkh04yzy2#
Wireless Tools包(iwlist是其中的一部分)还包含一个Wireless Tools Helper Library。(即add -liw)。然后查找iw_set_ext函数的文档。SIOCSIWSCAN参数将是最常用的。有关如何使用此接口的示例,查看KDE库中的KWifiManager源代码(参见:Interface_wireless_wirelessextensions::get_available_networks方法)。或者,您也可以下载Wireless Tools source code并查看iwlib iw_set_ext函数如何用于iwlist. c中的扫描。
至于特权,我想进程需要以root身份运行才能执行扫描。我想知道这是否也可以以其他方式完成。
由于您使用的是Ubuntu 8.04,因此libiw-dev包应该有用。
hpcdzsge3#
您可以使用
nmcli
,它不需要root权限或WIFI接口名称。字符串