如何发送命令到网络接口与netlink库

问题描述:

我开始与wifi相关的项目,我已经完成了一个与Linux的ioctl调用。现在我必须在libnl的帮助下做同样的事情,因为ioctl现在已经被弃用了,我已经阅读了所有的核心文档,但仍然不明白如何在特定接口上发送命令。我怎样才能发送命令到网络界面?说我想发送NL80211_CMD_TRIGGER_SCAN,我怎么能做到这一点?任何示例代码都非常感谢,因为它将成为我旅程的开始。 据我了解,现在我必须创建libnl插座,是这样的:如何发送命令到网络接口与netlink库

struct nl_sock *socket; 
sock = nl_socket_alloc(); 

然后撰写nl_msg消息,我的命令,并将其发送,但如何?

P.S.假设与nl_send(),但我希望你明白,我坚持在没有理解这一点如何这个工程的想法点

我也在处理涉及netlink的东西。我拼凑出一个似乎可以在我的系统上运行的程序(debian 3.2.0.4)。这是一个简单的程序,首先发送消息并开始监听来自内核的更新。我相信你将不得不改变发送部分,并设置必要的标志等。

一个相当重要的区别:我不调用nl_socket_alloc,而是创建一个常规套接字。我相信我在那里有一些错误,你可以直截了当。我希望它有帮助:

#include <iostream> 
#include <unistd.h> 
#include <sys/socket.h> 
#include <netlink/netlink.h> 
#include <netlink/socket.h> 
#include <netlink/cache.h> 
#include <netlink/route/link.h> 
//#include <> 

#define NETLINK_USER 31 

#define MAX_PAYLOAD 1024 

using std::cout; 
using std::endl; 

int sequence_number = 0; 

void sendNetLinkMsg(int fd) { 
    struct nlmsghdr *nh = 0; 
    struct sockaddr_nl sa; 
    struct iovec iov = { nh, nh->nlmsg_len }; 
    struct msghdr msg; 

    msg = {&sa, sizeof(sa), &iov, 1, NULL, 0, 0}; 
    memset(&sa, 0, sizeof(sa)); 
    sa.nl_family = AF_NETLINK; 
    nh->nlmsg_pid = getpid(); 
    nh->nlmsg_seq = ++sequence_number; 
    nh->nlmsg_flags |= NLM_F_ACK; 

    sendmsg(fd, &msg, 0); 
} 

void recvNetLinkMsg(int fd, struct msghdr* msg, char* buf) { 
    int len; 
    struct nlmsghdr *nh; 
    len = recvmsg(fd, msg, 0); 
    for (nh = (struct nlmsghdr *) buf; NLMSG_OK(nh, len); nh = NLMSG_NEXT(nh, len)) { 
     if (nh->nlmsg_type == NLMSG_DONE) 
      break; 

     if (nh->nlmsg_type == NLMSG_ERROR) { 
      cout << "Error" << endl; 
     } 
     if (nh->nlmsg_type == RTM_DELROUTE) 
      cout << "Delete route" << endl; 
     else if (nh->nlmsg_type == RTM_NEWROUTE) 
      cout << "New route" << endl; 
     else { 
      cout << "Unknown msg: " << nh->nlmsg_type << endl; 
     } 
    } 
} 

int main() { 
    struct sockaddr_nl sockAddr; 
    memset(&sockAddr, 0, sizeof(sockAddr)); 
    sockAddr.nl_family = AF_NETLINK; 
    sockAddr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE; 

    int fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); 
    bind(fd, (struct sockaddr *) &sockAddr, sizeof(sockAddr)); 

    char buf[4096]; 
    struct iovec iov = { buf, sizeof(buf) }; 
    struct msghdr msg; 

    msg = {&sockAddr, sizeof(sockAddr), &iov, 1, NULL, 0, 0}; 

    sendNetLinkMsg(fd); 

    while (true) { 
     recvNetLinkMsg(fd, &msg, buf); 
    } 
    return 0; 
} 
+0

我用这个页面,并在那里运行的代码大多没有任何重大问题。帮助解析邮件很多:[http://maz-programmersdiary.blogspot.com/2011/09/netlink-sockets.html](http://maz-programmersdiary.blogspot.com/2011/09/netlink- sockets.html)另外,发现这个网页是有帮助的:[http://softengcrunch.blogspot.com/2011/01/communicating-with-kernel-via-netlink.html](http://softengcrunch.blogspot.com /2011/01/communicating-with-kernel-via-netlink.html) – user2758084