内核与用户态通信(setsockopt).docx

上传人:hw****26 文档编号:2400486 上传时间:2019-05-11 格式:DOCX 页数:4 大小:20.27KB
下载 相关 举报
内核与用户态通信(setsockopt).docx_第1页
第1页 / 共4页
内核与用户态通信(setsockopt).docx_第2页
第2页 / 共4页
内核与用户态通信(setsockopt).docx_第3页
第3页 / 共4页
内核与用户态通信(setsockopt).docx_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、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

2、 #include #define SOCKET_OPS_BASE 128 #define SOCKET_OPS_SET (SOCKET_OPS_BASE) #define SOCKET_OPS_GET (SOCKET_OPS_BASE) #define SOCKET_OPS_MAX (SOCKET_OPS_BASE + 1) #define KMSG “a message from kernel“ #define KMSG_LEN sizeof(“a message from kernel“) MODULE_LICENSE(“GPL“); static int recv_msg(struct

3、 sock *sk, int cmd, void _user *user, unsigned int len) int ret = 0; printk(KERN_INFO “sockopt: recv_msg()n“); if (cmd = SOCKET_OPS_SET) char umsg64; int len = sizeof(char)*64; memset(umsg, 0, len); ret = copy_from_user(umsg, user, len); printk(“recv_msg: umsg = %s. ret = %dn“, umsg, ret); return 0;

4、 static int send_msg(struct sock *sk, int cmd, void _user *user, int *len) int ret = 0; printk(KERN_INFO “sockopt: 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); return 0; static struct nf_sockopt_ops t

5、est_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, ; static int _init init_sockopt(void) printk(KERN_INFO “sockopt: init_sockopt()n“); return nf_r

6、egister_sockopt( static void _exit fini_sockopt(void) printk(KERN_INFO “sockopt: fini_sockopt()n“); nf_unregister_sockopt( module_init(init_sockopt); module_exit(fini_sockopt); user.c: #include #include #include #include #include #include #define SOCKET_OPS_BASE 128 #define SOCKET_OPS_SET (SOCKET_OP

7、S_BASE) #define SOCKET_OPS_GET (SOCKET_OPS_BASE) #define SOCKET_OPS_MAX (SOCKET_OPS_BASE + 1) #define UMSG “a message from userspace“ #define UMSG_LEN sizeof(“a message from userspace“) char kmsg64; int main(void) int sockfd; int len; int ret; sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW); if(sock

8、fd 0) printf(“can not create a socketn“); return -1; /*call function recv_msg()*/ ret = setsockopt(sockfd, IPPROTO_IP, SOCKET_OPS_SET, UMSG, UMSG_LEN); printf(“setsockopt: ret = %d. msg = %sn“, ret, UMSG); len = sizeof(char)*64; /*call function send_msg()*/ ret = getsockopt(sockfd, IPPROTO_IP, SOCKE

9、T_OPS_GET, kmsg, printf(“getsockopt: ret = %d. msg = %sn“, ret, kmsg); if (ret != 0) printf(“getsockopt error: errno = %d, errstr = %sn“, errno, strerror(errno); close(sockfd); return 0; Makefile: TARGET = test OBJS = test.o MDIR = drivers/misc EXTRA_CFLAGS = -DEXPORT_SYMTAB CURRENT = $(shell uname

10、-r) KDIR = /lib/modules/$(CURRENT)/build PWD = $(shell pwd) DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR) obj-m := $(TARGET).o $(TARGET)-objs :=module.o default: make -C $(KDIR) SUBDIRS=$(PWD) modules gcc -o user user.c $(TARGET).o: $(OBJS) $(LD) $(LD_RFLAG) -r -o $ $(OBJS) ifneq (,$(findstring 2.4.

11、,$(CURRENT) install: su -c “cp -v $(TARGET).o $(DEST) & /sbin/depmod -a“ else install: su -c “cp -v $(TARGET).ko $(DEST) & /sbin/depmod -a“ endif clean: -rm -rf *.o *.ko .$(TARGET).ko.cmd .*.flags *.mod.c modules.orderModule.symvers .tmp_versions -rm -rf protocol/*.o protocol/.*.o.cmd -rm -rf user -include $(KDIR)/Rules.make

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。