linux添加libnet,Linux libnetlink 编程

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

netlink 是Linux内核和用户空间程序消息通信的一种方法。

rtnetlink 是 netlink 的一个子集,用于访问内核中的路由表,网口,IP地址等信息。

libnetlink 是为了方便使用rtnetlink服务而设计的API。

285f15bfa1db

image.png

为了安装libnetlink.h,执行下面命令:

$ dnf install iproute-devel

例1. 打印所有的IP地址

# cat list-addr.c

#include //perror()

#include //exit()

#include //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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值