收藏 分销(赏)

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

上传人:pc****0 文档编号:9010567 上传时间:2025-03-11 格式:DOCX 页数:4 大小:20.27KB
下载 相关 举报
内核与用户态通信(setsockopt).docx_第1页
第1页 / 共4页
内核与用户态通信(setsockopt).docx_第2页
第2页 / 共4页
点击查看更多>>
资源描述
netfilter提供了nf_register_sockopt()和nf_unregister_sockopt()来动态登记或取消sockopt命令字;打开一个网络socket后可以使用set/getsockopt(2)可实现用户空间与内核的通信,本质和ioctl差不多,区别在于set/getsockopt不用新建设备,直接利用系统已有的socket类型就可以进行,可用setsockopt函数向内核写数据,用getsockopt向内核读数据。 module.c: #include <linux/module.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/string.h> #include <linux/netfilter_ipv4.h> #include <linux/init.h> #include <asm/uaccess.h>  #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 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 umsg[64];         int len = sizeof(char)*64;         memset(umsg, 0, len);         ret = copy_from_user(umsg, user, len);         printk("recv_msg: umsg = %s. ret = %d\n", umsg, ret);             }     return 0; }  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. success\n", KMSG, ret);         }     return 0; }  static struct nf_sockopt_ops test_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_register_sockopt(&test_sockops); }  static void __exit fini_sockopt(void) {     printk(KERN_INFO "sockopt: fini_sockopt()\n");      nf_unregister_sockopt(&test_sockops); }  module_init(init_sockopt);  module_exit(fini_sockopt);  user.c: #include <unistd.h> #include <stdio.h> #include <sys/socket.h> #include <linux/in.h> #include <string.h> #include <errno.h>  #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 UMSG      "a message from userspace" #define UMSG_LEN  sizeof("a message from userspace")  char kmsg[64];  int main(void) {     int sockfd;     int len;     int ret;      sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);     if(sockfd < 0)     {         printf("can not create a socket\n");         return -1;     }      /*call function recv_msg()*/     ret = setsockopt(sockfd, IPPROTO_IP, SOCKET_OPS_SET, UMSG, UMSG_LEN);     printf("setsockopt: ret = %d. msg = %s\n", ret, UMSG);     len = sizeof(char)*64;      /*call function send_msg()*/     ret = getsockopt(sockfd, IPPROTO_IP, SOCKET_OPS_GET, kmsg, &len);     printf("getsockopt: ret = %d. msg = %s\n", ret, kmsg);     if (ret != 0)     {         printf("getsockopt error: errno = %d, errstr = %s\n", errno, strerror(errno));     }      close(sockfd);     return 0; } Makefile: TARGET = test OBJS = test.o MDIR = drivers/misc EXTRA_CFLAGS = -DEXPORT_SYMTAB CURRENT = $(shell uname -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.,$(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.order  Module.symvers .tmp_versions     -rm -rf protocol/*.o protocol/.*.o.cmd     -rm -rf user -include $(KDIR)/Rules.make
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服