日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux netlink 编程示例(二)应用层

發(fā)布時(shí)間:2025/4/5 linux 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux netlink 编程示例(二)应用层 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章給出一個(gè)netlink應(yīng)用層程序用例,和上一篇博客內(nèi)核篇結(jié)合起來參考。

內(nèi)核版本:3.4.39

nlclient.c

/** Description : 應(yīng)用層netlink編程* Date :20180529* Author :mason* Mail : mrsonko@126.com**/ #include <linux/netlink.h> #include <linux/socket.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <stdio.h>#include "nlclient.h" void main() {int nlfd;int *value;int opt, arg;unsigned int len;struct iovec iov[1];struct msghdr msg;struct sockaddr_nl src, dst; struct nlmsghdr *nlh, *nlh1, *nlh2 = NULL;// 創(chuàng)建netlink套接字nlfd = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_TEST_MODULE);if (nlfd == -1) {log("create netlink socket fail\n");return;}memset(&src, 0, sizeof(struct sockaddr_nl));memset(&dst, 0, sizeof(struct sockaddr_nl));memset(&msg, 0, sizeof(struct msghdr)); // 設(shè)置本地地址src.nl_family = AF_NETLINK; src.nl_pid = getpid(); src.nl_groups = 0; // 設(shè)置內(nèi)核netlink地址dst.nl_family = AF_NETLINK;dst.nl_pid = 0; dst.nl_groups = 0;// 綁定本地地址bind(nlfd, (struct sockaddr*)&src, sizeof(struct sockaddr_nl));// 申請(qǐng)netlink消息頭域nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(int));while(1) {log("input option :\n""1 : set \n""2 : get \n""default : quit\n");scanf("%d", &opt);switch (opt) {// set case 1 : log("input value to set:");scanf("%d", &arg); memset(nlh, 0, NLMSG_SPACE(sizeof(int)));nlh->nlmsg_len = NLMSG_SPACE(sizeof(int));// 設(shè)置netlink 應(yīng)用層的pidnlh->nlmsg_pid = getpid();// 設(shè)置消息類型nlh->nlmsg_type = NLKERNEL_SET;// 設(shè)置標(biāo)志位nlh->nlmsg_flags = NLM_F_REQUEST;// 填充發(fā)送消息結(jié)構(gòu)體iov[0].iov_base = (void *)nlh;iov[0].iov_len = nlh->nlmsg_len;value = (int *)NLMSG_DATA(nlh);*value = arg;msg.msg_name = (void *)&dst;msg.msg_namelen = sizeof(struct sockaddr_nl);msg.msg_iov = &iov[0];msg.msg_iovlen = 1;// 發(fā)送netlink 消息給內(nèi)核sendmsg(nlfd, &msg, 0);log("send set msg to kernel success \n\n");break;// getcase 2 : memset(nlh, 0, NLMSG_SPACE(int));nlh->nlmsg_len = NLMSG_SPACE(int);nlh->nlmsg_pid = getpid();// 設(shè)置netlink消息類型nlh->nlmsg_type = NLKERNEL_GET;nlh->nlmsg_flags = NLM_F_REQUEST;iov[0].iov_base = (void *)nlh;iov[0].iov_len = nlh->nlmsg_len;msg.msg_name = (void *)&dst;msg.msg_namelen = sizeof(struct sockaddr_nl);msg.msg_iov = &iov[0];msg.msg_iovlen = 1;// 發(fā)送消息log("send get msg to kernel success \n");sendmsg(nlfd, &msg, 0);memset(nlh, 0, NLMSG_SPACE(sizeof(int)));nlh->nlmsg_len = NLMSG_SPACE(sizeof(int));iov[0].iov_base = (void *)nlh;iov[0].iov_len = nlh->nlmsg_len;msg.msg_iov = &iov[0];msg.msg_iovlen = 1; // 接收netlink內(nèi)核端消息len = recvmsg(nlfd, &msg, 0);value = (int *)NLMSG_DATA(nlh);log("kernel return : %d \r\n\n", *value);break;default :goto end;}}end: close(nlfd);if (nlh)free(nlh); return ; }

nlclient.h

#ifndef _NLCLIENT_H #define _NLCLIENT_H #define log(fmt,arg...) \printf("[nlclient] "fmt,##arg)#define NETLINK_TEST_MODULE 17 /* 抓包 netlink 協(xié)議 */typedef enum netlink_msg_type {NLKERNEL_GET = NLMSG_MIN_TYPE +1, /* value : 17 */NLKERNEL_SET, /* value : 18 */NLKERNEL_END, }NETLINK_MSG_TYPE;#endif

Makefile

nlclient:$(CC) -o nlclient nlclient.c clean:@rm -rf *.o nlclient

代碼可以在github上 clone下來運(yùn)行

git@github.com:FuYuanDe/nlnetlink.git

編譯完成后先運(yùn)行netlink內(nèi)核端再運(yùn)行應(yīng)用層程序,否則會(huì)出現(xiàn)創(chuàng)建netlink套接字失敗問題。

運(yùn)行截圖如下:

應(yīng)用層:分別執(zhí)行了get, set, get 操作,通過netlink與內(nèi)核通信


內(nèi)核端:


相比其它的用戶空間與內(nèi)核空間通信方式,netlink的交互性非常好。此外在實(shí)際應(yīng)用的時(shí)候要注意字節(jié)對(duì)齊問題。

總結(jié)

以上是生活随笔為你收集整理的linux netlink 编程示例(二)应用层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。