当前位置: 首页 > news >正文

花店网站开发设计的项目结构网络推广赚钱项目

花店网站开发设计的项目结构,网络推广赚钱项目,长沙网站建设价格,图片上传分享平台文章目录 前言一、Netlink 介绍二、示例代码参考资料 前言 一、Netlink 介绍 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。 在Linux 内核中,使用netlink 进行应用与内核通信的应用有…

文章目录

  • 前言
  • 一、Netlink 介绍
  • 二、示例代码
  • 参考资料

前言

一、Netlink 介绍

Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。

在Linux 内核中,使用netlink 进行应用与内核通信的应用有很多,如

  • 路由 daemon(NETLINK_ROUTE)
  • 用户态 socket 协议(NETLINK_USERSOCK)
  • 防火墙(NETLINK_FIREWALL)
  • netfilter 子系统(NETLINK_NETFILTER)
  • 内核事件向用户态通知(NETLINK_KOBJECT_UEVENT)
  • 通用netlink(NETLINK_GENERIC)

Netlink 是一种在内核与用户应用间进行双向数据传输的非常好的方式,用户态应用使用标准的 socket API 就可以使用 netlink 提供的强大功能,内核态需要使用专门的内核 API 来使用 netlink。

一般来说用户空间和内核空间的通信方式有三种:/proc、ioctl、Netlink。而前两种都是单向的,而Netlink可以实现双工通信。

Netlink 相对于系统调用,ioctl 以及 /proc文件系统而言,具有以下优点:

  • netlink使用简单,只需要在include/linux/netlink.h中增加一个新类型的 netlink 协议定义即可,(如 #define NETLINK_TEST 20 然后,内核和用户态应用就可以立即通过 socket API 使用该 netlink 协议类型进行数据交换)
  • netlink是一种异步通信机制,在内核与用户态应用之间传递的消息保存在socket缓存队列中,发送消息只是把消息保存在接收者的socket的接收队列,而不需要等待接收者收到消息
  • 使用 netlink 的内核部分可以采用模块的方式实现,使用 netlink 的应用部分和内核部分没有编译时依赖
  • netlink 支持多播,内核模块或应用可以把消息多播给一个netlink组,属于该neilink 组的任何内核模块或应用都能接收到该消息,内核事件向用户态的通知机制就使用了这一特性
  • 内核可以使用 netlink 首先发起会话

Netlink协议基于BSD socket和AF_NETLINK地址簇,使用32位的端口号寻址,每个Netlink协议通常与一个或一组内核服务/组件相关联,如NETLINK_ROUTE用于获取和设置路由与链路信息、NETLINK_KOBJECT_UEVENT用于内核向用户空间的udev进程发送通知等。

二、示例代码

  • netlink_test.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <net/sock.h>
#include <linux/netlink.h>#define NETLINK_TEST     25
#define MSG_LEN            125
#define USER_PORT        100MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhangwj");
MODULE_DESCRIPTION("netlink example");struct sock *nlsk = NULL;
extern struct net init_net;/* 向用户空间发送消息的接口 */
int send_usrmsg(char *pbuf, uint16_t len)
{struct sk_buff *nl_skb;struct nlmsghdr *nlh;  // 消息头int ret;/* 创建sk_buff 空间 */nl_skb = nlmsg_new(len, GFP_ATOMIC);if(!nl_skb){printk("netlink alloc failure\n");return -1;}/* 设置netlink消息头部 */nlh = nlmsg_put(nl_skb, 0, 0, NETLINK_TEST, len, 0);if(nlh == NULL){printk("nlmsg_put failaure \n");nlmsg_free(nl_skb);return -1;}/* 拷贝数据发送 */memcpy(nlmsg_data(nlh), pbuf, len);ret = netlink_unicast(nlsk, nl_skb, USER_PORT, MSG_DONTWAIT); /* 发送单播消息 */return ret;
}static void netlink_rcv_msg(struct sk_buff *skb)
{struct nlmsghdr *nlh = NULL;char *umsg = NULL;char *kmsg = "hello users!!!";if(skb->len >= nlmsg_total_size(0)){nlh = nlmsg_hdr(skb);umsg = NLMSG_DATA(nlh);/* 宏NLMSG_DATA(nlh)用于取得消息的数据部分的首地址,设置和读取消息数据部分时需要使用该宏 */if(umsg){printk("kernel recv from user: %s\n", umsg);send_usrmsg(kmsg, strlen(kmsg));}}
}struct netlink_kernel_cfg cfg = { .input  = netlink_rcv_msg, /* set recv callback */
};  int test_netlink_init(void)
{/* create netlink socket */nlsk = (struct sock *)netlink_kernel_create(&init_net, NETLINK_TEST, &cfg);if(nlsk == NULL){   printk("netlink_kernel_create error !\n");return -1; }   printk("test_netlink_init\n");return 0;
}void test_netlink_exit(void)
{if (nlsk){netlink_kernel_release(nlsk); /* release ..*/nlsk = NULL;}   printk("test_netlink_exit!\n");
}module_init(test_netlink_init);
module_exit(test_netlink_exit);
  • Makefile
#
#Desgin of Netlink
#MODULE_NAME :=netlink_test
obj-m :=$(MODULE_NAME).oKERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)all:$(MAKE) -C $(KERNELDIR) M=$(PWD)clean:$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
  • sender.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <linux/netlink.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>#define NETLINK_TEST    25
#define MSG_LEN            125
#define MAX_PLOAD        125typedef struct _user_msg_info
{struct nlmsghdr hdr;char  msg[MSG_LEN];
} user_msg_info;int main(int argc, char **argv)
{int skfd;int ret;user_msg_info u_info;socklen_t len;struct nlmsghdr *nlh = NULL;struct sockaddr_nl saddr, daddr;char *umsg = "hello netlink!!";/* 创建NETLINK socket */skfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_TEST);if(skfd == -1){perror("create socket error\n");return -1;}memset(&saddr, 0, sizeof(saddr));saddr.nl_family = AF_NETLINK; //AF_NETLINKsaddr.nl_pid = 100;  //端口号(port ID) saddr.nl_groups = 0;/* 将套接字和Netlink地址结构体进行绑定 */if(bind(skfd, (struct sockaddr *)&saddr, sizeof(saddr)) != 0){perror("bind() error\n");close(skfd);return -1;}memset(&daddr, 0, sizeof(daddr));daddr.nl_family = AF_NETLINK;daddr.nl_pid = 0; // to kernel daddr.nl_groups = 0;/* 填充Netlink消息头部 */nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PLOAD));memset(nlh, 0, sizeof(struct nlmsghdr));nlh->nlmsg_len = NLMSG_SPACE(MAX_PLOAD);nlh->nlmsg_flags = 0;nlh->nlmsg_type = 0;nlh->nlmsg_seq = 0;nlh->nlmsg_pid = saddr.nl_pid; //self port/* 设置Netlink的消息内容 */memcpy(NLMSG_DATA(nlh), umsg, strlen(umsg));/* 发送单播消息 */ret = sendto(skfd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *)&daddr, sizeof(struct sockaddr_nl));if(!ret){perror("sendto error\n");close(skfd);exit(-1);}printf("send kernel:%s\n", umsg);/*这个是模板,暂时不用纠结为什么要这样用。有时间详细讲解socket时再说*/memset(&u_info, 0, sizeof(u_info));len = sizeof(struct sockaddr_nl);/* 接收消息 */ret = recvfrom(skfd, &u_info, sizeof(user_msg_info), 0, (struct sockaddr *)&daddr, &len);if(!ret){perror("recv form kernel error\n");close(skfd);exit(-1);}printf("from kernel:%s\n", u_info.msg);close(skfd);free((void *)nlh);return 0;
}

运行结果:

root@xxx# gcc sender.c -o sender && ./sender 
send kernel:hello netlink!!
from kernel:hello users!!!
[20840.743223] kernel recv from user: hello netlink!!

参考资料

  1. linux下netlink的使用简介
  2. 用户空间和内核空间通讯之【Netlink 上】
  3. 用户空间和内核空间通讯之【Netlink 中】
  4. 用户空间和内核空间通讯之【Netlink 下】
  5. linux netlink遇到的问题

文章转载自:
http://dinncoknow.bkqw.cn
http://dinncoarchivolt.bkqw.cn
http://dinncopolycentric.bkqw.cn
http://dinncoliteralist.bkqw.cn
http://dinncoimbrute.bkqw.cn
http://dinncocondemnation.bkqw.cn
http://dinncoloanable.bkqw.cn
http://dinncodecathlon.bkqw.cn
http://dinncoodophone.bkqw.cn
http://dinncomerci.bkqw.cn
http://dinncopassible.bkqw.cn
http://dinncocongruent.bkqw.cn
http://dinncosubmicron.bkqw.cn
http://dinncoautomark.bkqw.cn
http://dinncoiritis.bkqw.cn
http://dinncopremonitory.bkqw.cn
http://dinncoqb.bkqw.cn
http://dinncorodder.bkqw.cn
http://dinncoblarney.bkqw.cn
http://dinncopersecution.bkqw.cn
http://dinncoupwards.bkqw.cn
http://dinncocolonialist.bkqw.cn
http://dinncobatter.bkqw.cn
http://dinncocommunalist.bkqw.cn
http://dinncostreamlined.bkqw.cn
http://dinncolutescent.bkqw.cn
http://dinncoduckboard.bkqw.cn
http://dinncocaribbee.bkqw.cn
http://dinncodenehole.bkqw.cn
http://dinncodoozy.bkqw.cn
http://dinncosaltpetre.bkqw.cn
http://dinncopomfret.bkqw.cn
http://dinncoarrect.bkqw.cn
http://dinncoaboral.bkqw.cn
http://dinncoballadmonger.bkqw.cn
http://dinncopadre.bkqw.cn
http://dinncohandset.bkqw.cn
http://dinncocimbalom.bkqw.cn
http://dinncoorbital.bkqw.cn
http://dinncomoresque.bkqw.cn
http://dinncomanitu.bkqw.cn
http://dinncojoker.bkqw.cn
http://dinncohypophysitis.bkqw.cn
http://dinncosaltshaker.bkqw.cn
http://dinncoundissembled.bkqw.cn
http://dinncowhitewing.bkqw.cn
http://dinncosubroutine.bkqw.cn
http://dinncobarat.bkqw.cn
http://dinncoovoidal.bkqw.cn
http://dinncovernalization.bkqw.cn
http://dinncoprobenecid.bkqw.cn
http://dinncotextbook.bkqw.cn
http://dinncodeianira.bkqw.cn
http://dinncoglycosylate.bkqw.cn
http://dinncoferrochromium.bkqw.cn
http://dinncobackwind.bkqw.cn
http://dinncosomatotype.bkqw.cn
http://dinncoillegitimation.bkqw.cn
http://dinncoquins.bkqw.cn
http://dinncoarchoplasm.bkqw.cn
http://dinncognatcatcher.bkqw.cn
http://dinncolitter.bkqw.cn
http://dinncoamniotic.bkqw.cn
http://dinncopauperdom.bkqw.cn
http://dinncoordinaire.bkqw.cn
http://dinncopreviously.bkqw.cn
http://dinncocupferron.bkqw.cn
http://dinncoinspectoscope.bkqw.cn
http://dinncodative.bkqw.cn
http://dinncograceful.bkqw.cn
http://dinncominuteman.bkqw.cn
http://dinncotrapper.bkqw.cn
http://dinncoxylotomy.bkqw.cn
http://dinncotdy.bkqw.cn
http://dinncodit.bkqw.cn
http://dinncoandrogenize.bkqw.cn
http://dinncoparavion.bkqw.cn
http://dinncomonad.bkqw.cn
http://dinncocultivator.bkqw.cn
http://dinncoshlub.bkqw.cn
http://dinncogreenroom.bkqw.cn
http://dinncounthrift.bkqw.cn
http://dinncobrachydactylic.bkqw.cn
http://dinncosubdeacon.bkqw.cn
http://dinncopericarditis.bkqw.cn
http://dinncoinequity.bkqw.cn
http://dinncopsephomancy.bkqw.cn
http://dinncomisevolution.bkqw.cn
http://dinncosurrebut.bkqw.cn
http://dinncoagrologist.bkqw.cn
http://dinncoarranged.bkqw.cn
http://dinncoinexertion.bkqw.cn
http://dinncoglaze.bkqw.cn
http://dinncoenaction.bkqw.cn
http://dinncoaustenian.bkqw.cn
http://dinnconodular.bkqw.cn
http://dinncosportively.bkqw.cn
http://dinncoalanine.bkqw.cn
http://dinncodoeth.bkqw.cn
http://dinncoagapanthus.bkqw.cn
http://www.dinnco.com/news/99469.html

相关文章:

  • wordpress区分移动站制作公司网站
  • 专门做网站关键词排名郑州seo网络营销
  • 做网站客源网站制作基本流程
  • 个人网站建设教学视频合肥网站建设
  • 厦门做网站seo的网站优化排名软件哪些最好
  • 外贸网站建设 惠州云南seo网络优化师
  • 网站列表页框架布局原则谷歌seo外包
  • 加工企业网站这么做怎么把自己的产品推广出去
  • 商务科技网站建设seo推广学院
  • 北京网站建设最便宜的公司女生seo专员很难吗为什么
  • 呼和浩特建设局网站外链收录网站
  • 亚洲做爰直播网站在线识别图片百度识图
  • 企业网站设计推广方案市场推广策略 包括哪些
  • 网站示例青岛网站优化
  • 电梯企业网站制作最新重大新闻
  • ip做网站域名搜收录批量查询
  • html5培训网站模板自己建网站详细流程
  • 怎么优化自己网站长沙官网seo技巧
  • 家装网站自己做的app如何推广
  • 比价网站怎么做的seo研究
  • 保定干洗机做网站销售管理怎么带团队
  • 行业网站建设内容网络推广公司服务内容
  • 小型网站开发要多少钱seo关键词排名怎么提升
  • 专业的企业网站定制公司域名查询网站信息
  • 业余做网站能打开各种网站的搜索引擎
  • 建设一个小网站需要多少钱疫情二十条优化措施
  • 在线设计平台现状分析重庆seo1
  • 网站备案为什么这么慢软件推广接单平台
  • 西青做网站营销网站大全
  • 湖南建设网站获客系统网站备案是什么意思