請有人給一個簡單的例子來說明如何使用libnl來使用nl80211。 我試圖通過iw源代碼,但它很混亂。 任何人都可以給出一個簡單的程序,瞭解如何使用libnl觸發NL80211_CMD_GET_WIPHY等nl80211命令。如何使用libnl庫觸發nl80211命令?
回答
這是一個非常基本的程序,發送一個NL80211_CMD_GET_INTERFACE
,並解析出在NL80211_CMD_GET_INTERFACE
屬性中返回的接口類型。
請注意,這裏有很少的錯誤檢查,您不應該使用任何此程序!幾乎所有這些功能都可能失敗。
#include "netlink/netlink.h"
#include "netlink/genl/genl.h"
#include "netlink/genl/ctrl.h"
#include <net/if.h>
//copy this from iw
#include "nl80211.h"
static int expectedId;
static int nlCallback(struct nl_msg* msg, void* arg)
{
struct nlmsghdr* ret_hdr = nlmsg_hdr(msg);
struct nlattr *tb_msg[NL80211_ATTR_MAX + 1];
if (ret_hdr->nlmsg_type != expectedId)
{
// what is this??
return NL_STOP;
}
struct genlmsghdr *gnlh = (struct genlmsghdr*) nlmsg_data(ret_hdr);
nla_parse(tb_msg, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),
genlmsg_attrlen(gnlh, 0), NULL);
if (tb_msg[NL80211_ATTR_IFTYPE]) {
int type = nla_get_u32(tb_msg[NL80211_ATTR_IFTYPE]);
printf("Type: %d", type);
}
}
int main(int argc, char** argv)
{
int ret;
//allocate socket
nl_sock* sk = nl_socket_alloc();
//connect to generic netlink
genl_connect(sk);
//find the nl80211 driver ID
expectedId = genl_ctrl_resolve(sk, "nl80211");
//attach a callback
nl_socket_modify_cb(sk, NL_CB_VALID, NL_CB_CUSTOM,
nlCallback, NULL);
//allocate a message
nl_msg* msg = nlmsg_alloc();
nl80211_commands cmd = NL80211_CMD_GET_INTERFACE;
int ifIndex = if_nametoindex("wlan0");
int flags = 0;
// setup the message
genlmsg_put(msg, 0, 0, expectedId, 0, flags, cmd, 0);
//add message attributes
NLA_PUT_U32(msg, NL80211_ATTR_IFINDEX, ifIndex);
//send the messge (this frees it)
ret = nl_send_auto_complete(sk, msg);
//block for message to return
nl_recvmsgs_default(sk);
return 0;
nla_put_failure:
nlmsg_free(msg);
return 1;
}
非常感謝程序給了我一個關於如何使用netlink套接字進行nl80211命令的概述。但是,如何使用netlinks獲得掃描結果,以及我們在掃描結束時如何知道。 –
那麼這是一個不同的問題,但基本上,你發送'NL80211_CMD_TRIGGER_SCAN'開始掃描。如果您在運行時嘗試啓動另一個,則會失敗。發送完畢後,當你收到一個'NL80211_CMD_NEW_SCAN_RESULTS'時,你會聽完掃描完成。然後您可以發送一個'NL80211_CMD_GET_SCAN'命令來詢問結果。每找到一個電臺,你都會收到一條消息,所以準備好處理多條消息。 – Inductiveload
感謝您的幫助。我明白了,並發現如何掃描。我的代碼現在工作正常,並掃描所有周圍的接入點。 –
- 1. 如何使用命令的觸發塊
- 2. 你如何使用libnl nl_sock?
- 3. 如何知道nl80211命令需要哪些參數?
- 4. WPF觸發命令
- 5. 如何使用chrome.com命令觸發另一個擴展中定義的命令
- 6. 如何在構建後觸發命令?
- 7. 觸發器沒有通過使用命令拷貝來觸發
- 8. WPF命令與事件觸發命令
- 9. 如何使用MySQL觸發器「假」,「開關」命令
- 10. 如何在Ubuntu終端中使用Java代碼觸發命令
- 11. nl80211 library&cfg80211如何工作?
- 12. 如何使3個命令中的一個onclick命令延遲兩次觸發?
- 13. MFC觸發器ID_FILE_OPEN命令
- 14. WebClient事件觸發命令
- 15. RowEditing命令沒有觸發
- 16. 命令「make menuconfig」如何使用ncurses庫?
- 17. 如何發送命令使用PHP
- 18. 如何使用ServiceStack發送命令?
- 19. 如何使用python發出sudo命令
- 20. 如何使用TIdTelnet發送命令?
- 21. 如何使用事件觸發器庫?
- 22. 如何使用ssh命令在命令中發送密碼
- 23. 如何通過命令行觸發應用程序啓動?
- 24. 使用nl80211.h掃描接入點
- 25. 如何使用SQL查詢或表更改高效地觸發系統命令?
- 26. 如何使用帶參數的命令提示符觸發一個exe文件
- 27. 從另一個Maven安裝命令觸發Maven安裝命令
- 28. 運行Windows從Oracle數據庫觸發命令
- 29. 如何使用命令行
- 30. 如何使用mysqlfrm命令?
我同意,iw很難進入。很多宏,並沒有太多評論! – Inductiveload