Linux libnetlink 编程

netlink,rtnetlink,libnetlink 三者之间的关系是:

  • netlink 是Linux内核和用户空间程序消息通信的一种方法。
  • rtnetlink 是 netlink 的一个子集,用于访问内核中的路由表,网口,IP地址等信息。
  • libnetlink 是为了方便使用rtnetlink服务而设计的API。
image.png
为了安装libnetlink.h,执行下面命令:
$ dnf install iproute-devel
例1. 打印所有的IP地址
# cat list-addr.c

#include <stdio.h>      //perror()
#include <stdlib.h>     //exit()
#include <libnetlink.h> //rtnl_handle

void die(char *s)
{
    perror(s);
    exit(1);
}

int get_addr(const struct sockaddr_nl *who, struct nlmsghdr *h, void *arg)
{
    struct ifaddrmsg * addr;
    struct rtattr * attr;
    int len;

    addr = NLMSG_DATA(h);
    len = RTM_PAYLOAD(h);

    /* loop over all attributes for the NEWLINK message */
    for (attr = IFLA_RTA(addr); RTA_OK(attr, len); attr = RTA_NEXT(attr, len))
    {
        switch (attr->rta_type)
        {
        case IFA_LABEL:
            printf("Interface  : %s\n", (char *)RTA_DATA(attr));
            break;
        case IFA_LOCAL:
        {
            int ip = *(int*)RTA_DATA(attr);
            unsigned char bytes[4];
            bytes[0] = ip & 0xFF;
            bytes[1] = (ip >> 8) & 0xFF;
            bytes[2] = (ip >> 16) & 0xFF;
            bytes[3] = (ip >> 24) & 0xFF;
            printf("IP Address : %d.%d.%d.%d\n", bytes[0], bytes[1], bytes[2], bytes[3]);
            break;
        }
        default:
            break;
        }
    }
}

int main()
{
    struct rtnl_handle rth;

    if (rtnl_open(&rth, 0))
    {
        die("rtnl_open()");
    }

    if (rtnl_wilddump_request(&rth, AF_INET, RTM_GETADDR) < 0) {
        die("rtnl_wilddump_request()");
    }

    if (rtnl_dump_filter(&rth, get_addr, NULL) < 0) {
        die("rtnl_dump_filter()");
    }

    rtnl_close( &rth );
    return 0;
}
# gcc list-addr.c -lnetlink -o list-addr && ./list-addr
IP Address : 127.0.0.1
Interface  : lo
IP Address : 10.254.52.242
Interface  : eth0
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,841评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,900评论 25 708
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,125评论 6 174
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,087评论 0 8
  • “像我这么善良的人还去哪儿找啊”,以前的我经常这么说。但是最近我越来越意识到自己一点儿也不善良。我写这篇只是发现了...
    雪糕同学阅读 1,558评论 0 0