簡體   English   中英

如何使用Netlink庫將命令發送到網絡接口

[英]How to send command to network interface with netlink library

我正在開始與wifi相關的項目,並且已經用linux ioctl調用完成了一個項目。 現在我必須在libnl的幫助下做同樣的事情,因為ioctl現在已被棄用,我已經閱讀了所有核心文檔,但是仍然不了解如何在特定接口上發送命令。 如何將命令發送到網絡接口? 說我要發送NL80211_CMD_TRIGGER_SCAN,我該怎么做? 任何示例代碼都將不勝感激,因為這將是我旅程的開始。 據我了解,我現在必須創建libnl套接字,例如:

struct nl_sock *socket;
sock = nl_socket_alloc();

然后用我的命令編寫nl_msg消息並發送,但是如何?

PS假設使用nl_send(),但我希望您了解我一直不了解該lib的工作原理

我也在從事涉及netlink的工作。 我拼湊了一個似乎可以在我的系統上運行的程序(debian 3.2.0.4)。 這是一個簡單的程序,它首先發送msg並開始監聽來自內核的更新。 我相信您將不得不更改發送部分並設置必要的標志等。

一個相當重要的區別:我不調用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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM