内核与用户态通信(setsockopt).docx_第1页
内核与用户态通信(setsockopt).docx_第2页
内核与用户态通信(setsockopt).docx_第3页
内核与用户态通信(setsockopt).docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

netfilter提供了nf_register_sockopt()和nf_unregister_sockopt()来动态登记或取消sockopt命令字;打开一个网络socket后可以使用set/getsockopt(2)可实现用户空间与内核的通信,本质和ioctl差不多,区别在于set/getsockopt不用新建设备,直接利用系统已有的socket类型就可以进行,可用setsockopt函数向内核写数据,用getsockopt向内核读数据。module.c:#include#include#include#include#include#include#include#defineSOCKET_OPS_BASE128#defineSOCKET_OPS_SET(SOCKET_OPS_BASE)#defineSOCKET_OPS_GET(SOCKET_OPS_BASE)#defineSOCKET_OPS_MAX(SOCKET_OPS_BASE+1)#defineKMSGamessagefromkernel#defineKMSG_LENsizeof(amessagefromkernel)MODULE_LICENSE(GPL);staticintrecv_msg(structsock*sk,intcmd,void_user*user,unsignedintlen)intret=0;printk(KERN_INFOsockopt:recv_msg()n);if(cmd=SOCKET_OPS_SET)charumsg64;intlen=sizeof(char)*64;memset(umsg,0,len);ret=copy_from_user(umsg,user,len);printk(recv_msg:umsg=%s.ret=%dn,umsg,ret);return0;staticintsend_msg(structsock*sk,intcmd,void_user*user,int*len)intret=0;printk(KERN_INFOsockopt:send_msg()n);if(cmd=SOCKET_OPS_GET)ret=copy_to_user(user,KMSG,KMSG_LEN);printk(send_msg:umsg=%s.ret=%d.successn,KMSG,ret);return0;staticstructnf_sockopt_opstest_sockops=.pf=PF_INET,.set_optmin=SOCKET_OPS_SET,.set_optmax=SOCKET_OPS_MAX,.set=recv_msg,.get_optmin=SOCKET_OPS_GET,.get_optmax=SOCKET_OPS_MAX,.get=send_msg,.owner=THIS_MODULE,;staticint_initinit_sockopt(void)printk(KERN_INFOsockopt:init_sockopt()n);returnnf_register_sockopt(&test_sockops);staticvoid_exitfini_sockopt(void)printk(KERN_INFOsockopt:fini_sockopt()n);nf_unregister_sockopt(&test_sockops);module_init(init_sockopt);module_exit(fini_sockopt);user.c:#include#include#include#include#include#include#defineSOCKET_OPS_BASE128#defineSOCKET_OPS_SET(SOCKET_OPS_BASE)#defineSOCKET_OPS_GET(SOCKET_OPS_BASE)#defineSOCKET_OPS_MAX(SOCKET_OPS_BASE+1)#defineUMSGamessagefromuserspace#defineUMSG_LENsizeof(amessagefromuserspace)charkmsg64;intmain(void)intsockfd;intlen;intret;sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);if(sockfd0)printf(cannotcreateasocketn);return-1;/*callfunctionrecv_msg()*/ret=setsockopt(sockfd,IPPROTO_IP,SOCKET_OPS_SET,UMSG,UMSG_LEN);printf(setsockopt:ret=%d.msg=%sn,ret,UMSG);len=sizeof(char)*64;/*callfunctionsend_msg()*/ret=getsockopt(sockfd,IPPROTO_IP,SOCKET_OPS_GET,kmsg,&len);printf(getsockopt:ret=%d.msg=%sn,ret,kmsg);if(ret!=0)printf(getsockopterror:errno=%d,errstr=%sn,errno,strerror(errno);close(sockfd);return0;Makefile:TARGET=testOBJS=test.oMDIR=drivers/miscEXTRA_CFLAGS=-DEXPORT_SYMTABCURRENT=$(shelluname-r)KDIR=/lib/modules/$(CURRENT)/buildPWD=$(shellpwd)DEST=/lib/modules/$(CURRENT)/kernel/$(MDIR)obj-m:=$(TARGET).o$(TARGET)-objs:=module.odefault:make-C$(KDIR)SUBDIRS=$(PWD)modulesgcc-ouseruser.c$(TARGET).o:$(OBJS)$(LD)$(LD_RFLAG)-r-o$(OBJS)ifneq(,$(findstring2.4.,$(CURRENT)install:su-ccp-v$(TARGET).o$(DEST)&/sbin/depmod-aelseinstall:su-ccp-v$(TARGET).ko$(DEST)&/sbin/depmod-aendifclean:-rm-rf*.o*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论