Netlink 是 Linux 内核与用户空间进程之间进行通信的一种机制。它提供了一种高效、灵活的方式来传递内核和用户空间之间的消息。Netlink 常用于网络管理工具,如 iproute2
工具集中的 ip
和 ss
命令。
Netlink 主要有以下几种类型:
Netlink 常用于以下场景:
iproute2
工具集中的 ip
和 ss
命令。以下是一个简单的示例代码,展示如何使用 Netlink 监测网卡状态:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#define BUF_SIZE 8192
void send_netlink_msg(int sockfd, struct nlmsghdr *nlh) {
struct sockaddr_nl sa;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sa.nl_pid = getpid();
sa.nl_groups = 0;
struct iovec iov;
iov.iov_base = (void *)nlh;
iov.iov_len = nlh->nlmsg_len;
struct msghdr msg;
memset(&msg, 0, sizeof(msg));
msg.msg_name = (void *)&sa;
msg.msg_namelen = sizeof(sa);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
sendmsg(sockfd, &msg, 0);
}
void receive_netlink_msg(int sockfd) {
char buf[BUF_SIZE];
struct msghdr msg;
struct iovec iov;
iov.iov_base = buf;
iov.iov_len = BUF_SIZE;
memset(&msg, 0, sizeof(msg));
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
struct nlmsghdr *nlh;
while (1) {
ssize_t len = recvmsg(sockfd, &msg, 0);
if (len < 0) {
perror("recvmsg");
break;
}
for (nlh = (struct nlmsghdr *)buf; NLMSG_OK(nlh, len); nlh = NLMSG_NEXT(nlh, len)) {
if (nlh->nlmsg_type == NLMSG_DONE) {
return;
}
printf("Received message type: %d\n", nlh->nlmsg_type);
}
}
}
int main() {
int sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (sockfd < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
struct sockaddr_nl sa;
memset(&sa, 0, sizeof(sa));
sa.nl_family = AF_NETLINK;
sa.nl_pid = getpid();
sa.nl_groups = RTMGRP_LINK;
if (bind(sockfd, (struct sockaddr *)&sa, sizeof(sa)) < 0) {
perror("bind");
close(sockfd);
exit(EXIT_FAILURE);
}
struct nlmsghdr nlh;
memset(&nlh, 0, sizeof(nlh));
nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
nlh.nlmsg_type = RTM_GETLINK;
nlh.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
nlh.nlmsg_seq = 0;
nlh.nlmsg_pid = getpid();
send_netlink_msg(sockfd, &nlh);
receive_netlink_msg(sockfd);
close(sockfd);
return 0;
}
sudo
运行程序。通过以上内容,你应该能够理解 Netlink 的基础概念、优势、类型、应用场景以及如何使用它来监测网卡状态。
领取专属 10元无门槛券
手把手带您无忧上云