• `PF_NETLINK` 是用于与内核通信的Socket族之一


    PF_NETLINK 是用于与内核通信的Socket族之一。在Linux系统中,Netlink是一种用于内核与用户空间进程之间通信的机制,而PF_NETLINK Socket族则用于创建与Netlink通信相关的Socket。通过Netlink Socket,用户空间程序可以与内核进行双向通信,从而实现对内核状态的查询、配置和控制。

    下面是一些关于 PF_NETLINK 的特点和用法:

    • 特点

      • 允许用户空间程序与内核进行高级别的通信,用于网络配置、路由表管理、监控等操作。

      • 提供了一种结构化的消息传递机制,支持多种消息类型和多个不同的协议族。

      • 允许用户空间程序向内核发送命令请求和接收内核的响应。

    • 用法

      • 创建 PF_NETLINK Socket:使用 socket(AF_NETLINK, SOCK_RAW, protocol) 函数创建一个 PF_NETLINK 类型的Socket。

      • 绑定 Socket 到 Netlink 协议:使用 bind() 函数将Socket绑定到特定的Netlink协议族。

      • 发送和接收消息:使用 sendmsg()recvmsg() 函数发送和接收消息到/从内核。

    下面是一个简单的示例,展示如何创建一个 PF_NETLINK Socket 并与内核通信:

    #include 
    #include 
    
    int main() {
        int fd;
        struct sockaddr_nl src_addr, dest_addr;
        struct nlmsghdr *nlh;
    
        // 创建 PF_NETLINK Socket
        fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_GENERIC);
        if (fd < 0) {
            perror("socket");
            return -1;
        }
    
        // 设置源地址
        memset(&src_addr, 0, sizeof(src_addr));
        src_addr.nl_family = AF_NETLINK;
        src_addr.nl_pid = getpid(); // 设置进程ID为源地址
    
        // 绑定源地址
        if (bind(fd, (struct sockaddr *)&src_addr, sizeof(src_addr)) < 0) {
            perror("bind");
            return -1;
        }
    
        // 构建消息
        nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));
        // 填充消息头、消息类型、消息数据等
    
        // 发送消息到内核
        sendmsg(fd, &msg, 0);
    
        // 在这里可以接收来自内核的消息并进行处理
    
        close(fd);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    这是一个简单的示例,演示了如何创建一个 PF_NETLINK Socket,并发送消息到内核。实际应用中,可以根据具体需求构建不同类型的消息,与内核进行通信,实现各种网络配置和管理操作。

  • 相关阅读:
    汽车专场 | 新能源汽车动力电池PACK CAE分析实例解读
    JS网页加载状态判断
    第一百六十六回 如何创建以图片为背景的页面
    为什么mysql索引用B+树而不用Hash表
    什么是单向数据流
    关于开发环境搭建
    1024程序员节特色海报两张
    zookeeper mac安装
    [C++] Reference
    spring的Ioc、DI以及Bean的理解
  • 原文地址:https://blog.csdn.net/sunfanup/article/details/136664997