我想获得一份可用的无线网络列表.理想情况下,这将是通过一些C调用,但我不介意我是否必须通过系统调用来解决它.如果所需的C呼叫或程序不需要一些奇特的第三方包,那就更好了.
互联网似乎建议我使用sudo iwlist
它似乎从命令行做的技巧,但我宁愿不要求root权限.我只想看到基础知识,而不是改变任何东西.
在命令行中进行扫描非常容易.手册页是你的朋友(查看iwconfig和iwlist).但是使用C接口有点困难所以我会专注于此.
首先,正如其他人所提到的,绝对要下载无线工具源代码.编程接口的所有文档都在.c文件中.据我所知,api没有web文档.但是,源代码很容易阅读.你几乎只需要iwlib.h和iwlib.c这个问题.
虽然您可以使用iw_set_ext
和iw_get_ext
,但libiw实现了基本扫描功能iw_scan
,您可以从中提取所需的大部分信息.
这是一个简单的程序,用于获取所有可用无线网络的ESSID.编译-liw
并运行sudo
.
#include#include #include 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方法).或者,您也可以下载无线工具源代码,并查看iwlib iw_set_ext函数如何用于在iwlist.c中进行扫描.
至于权限,我想这个过程需要以root身份运行才能执行扫描.我很想知道是否可以这样做.
由于您使用的是Ubuntu 8.04,因此应该使用libiw-dev软件包.