Network programming 如何使用libnl库触发nl80211命令?

Network programming 如何使用libnl库触发nl80211命令?,network-programming,wifi,embedded-linux,netlink,Network Programming,Wifi,Embedded Linux,Netlink,请有人给出一个简单的例子,说明如何使用libnl来使用nl80211。 我试图浏览iw源代码,但它非常混乱。 任何人都可以给出一个简单的程序,说明如何使用libnl触发nl80211_CMD_GET_WIPHY等nl80211命令。下面是一个非常基本的程序,它发送一个nl80211_CMD_GET_INTERFACE,并解析出nl80211_CMD_GET_INTERFACE属性中返回的接口类型 注意,这里几乎没有错误检查,您不应该按原样使用任何程序!几乎所有这些功能都可能失败 #包括“netl

请有人给出一个简单的例子,说明如何使用libnl来使用nl80211。 我试图浏览iw源代码,但它非常混乱。
任何人都可以给出一个简单的程序,说明如何使用libnl触发nl80211_CMD_GET_WIPHY等nl80211命令。

下面是一个非常基本的程序,它发送一个
nl80211_CMD_GET_INTERFACE
,并解析出
nl80211_CMD_GET_INTERFACE
属性中返回的接口类型

注意,这里几乎没有错误检查,您不应该按原样使用任何程序!几乎所有这些功能都可能失败

#包括“netlink/netlink.h”
#包括“netlink/genl/genl.h”
#包括“netlink/genl/ctrl.h”
#包括
//从iw复制这个
#包括“nl80211.h”
静态int-expectedd;
静态int-nlCallback(结构nl_-msg*msg,void*arg)
{
结构nlmsghdr*ret_hdr=nlmsg_hdr(msg);
结构nlattr*tb_msg[NL80211_ATTR_MAX+1];
如果(ret_hdr->nlmsg_type!=expectedId)
{
//这是什么??
返回NL_站;
}
结构genlmsghdr*gnlh=(结构genlmsghdr*)nlmsg_数据(ret_hdr);
nla_解析(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(“类型:%d”,类型);
}
}
int main(int argc,字符**argv)
{
int ret;
//分配套接字
nl_sock*sk=nl_socket_alloc();
//连接到通用网络链接
genl_connect(sk);
//查找nl80211驱动程序ID
expectedId=genl\u ctrl\u resolve(sk,“nl80211”);
//附加回拨
nl_套接字_修改_cb(sk,nl_cb_有效,nl_cb_自定义,
nlCallback,NULL);
//分配消息
nl_msg*msg=nlmsg_alloc();
nl80211_命令cmd=nl80211_cmd_GET_接口;
int ifIndex=if_nametoindex(“wlan0”);
int标志=0;
//设置消息
genlmsg_put(msg,0,0,expectedId,0,flags,cmd,0);
//添加消息属性
NLA_PUT_U32(msg,NL80211_ATTR_IFINDEX,IFINDEX);
//发送消息(这将释放消息)
ret=nl_发送_自动完成(sk,msg);
//用于返回消息的块
nl_recvmsgs_默认值(sk);
返回0;
nla_put_故障:
nlmsg_免费(msg);
返回1;
}

我同意,我很难进入。很多宏,没有太多注释!Thanx该程序向我概述了如何使用netlink套接字执行nl80211命令。但是,如何使用netlinks获得扫描结果,以及我们如何知道扫描何时结束。这是一个不同的问题,但基本上,您发送一个
NL80211\u CMD\u TRIGGER\u scan
开始扫描。如果在一个正在运行时尝试启动另一个,则会失败。发送此信息后,当您收到
NL80211\u CMD\u NEW\u scan\u结果时,请仔细聆听扫描是否完成。然后,您可以发送
NL80211\u CMD\u GET\u SCAN
命令来询问结果。找到的每个站点都会返回一条消息,因此请准备好处理多条消息。谢谢您的帮助。我终于找到了,找到了扫描的方法。我的代码现在运行良好,正在扫描所有周围的AP。如何用g++编译它?linux上需要链接什么?gcc-Wall-I/usr/include/libnl3/main.c-o main-lnl-3-lnl-genl-3