2008-12-30 148 views
31

我想獲得可用無線網絡的列表。理想情況下,這將通過一些C調用,但我不介意是否必須通過系統調用來修改它。如果所需的C調用或程序不需要一些奇特的第三方軟件包,那更好。如何獲得Linux上的可用無線網絡列表?

互聯網似乎暗示我使用sudo iwlist <interface> scan似乎從命令行做伎倆,但我寧願不需要root權限。我只想看到基礎知識,不會改變任何事情。

+2

您不需要root就可以運行iwlist,但它只會報告上次定期掃描的緩存值。要強制進行新的掃描,您需要成爲root用戶。 – Hudson 2008-12-30 15:02:16

+0

嗯,當運行非root用戶時,至少在Ubuntu 8上不會返回任何內容。04: -/ – richq 2008-12-30 15:21:55

回答

26

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軟件包。

+0

我可以在商業應用程序中使用** Wirelsess Tool **包(** libiw-dev **)嗎?可能我不能,但我想確定。 – rraszewski 2014-09-04 10:11:32

35

在命令行中執行掃描非常簡單。手冊頁是你的朋友在這裏(檢查出iwconfigiwlist)。但是使用C接口有點困難,所以我會專注於此。

首先,正如其他人所提到的,絕對要下載出wireless tools source code。編程接口的所有文檔位於.c文件中。據我所知,這個API沒有web文檔。但是,源代碼很容易閱讀。你幾乎只需要iwlib.hiwlib.c這個問題。

雖然你可以使用iw_set_extiw_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源代碼!

相關問題