内核与用户态通信(setsockopt)

内核与用户态通信(setsockopt)

ID:40785268

大小:20.27 KB

页数:4页

时间:2019-08-07

内核与用户态通信(setsockopt)_第1页
内核与用户态通信(setsockopt)_第2页
内核与用户态通信(setsockopt)_第3页
内核与用户态通信(setsockopt)_第4页
资源描述:

《内核与用户态通信(setsockopt)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、netfilter提供了nf_register_sockopt()和nf_unregister_sockopt()来动态登记或取消sockopt命令字;打开一个网络socket后可以使用set/getsockopt(2)可实现用户空间与内核的通信,本质和ioctl差不多,区别在于set/getsockopt不用新建设备,直接利用系统已有的socket类型就可以进行,可用setsockopt函数向内核写数据,用getsockopt向内核读数据。module.c:#include #include 

2、>#include #include #include #include #include  #define SOCKET_OPS_BASE          128#define SOCKET_OPS_SET       (SOCKET_OPS_BASE)#define SOCKET_OPS_GET      (SOCKET_OPS_BASE)#define SOCKET_OPS_MAX 

3、      (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

4、_msg()");        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", umsg, ret);            }    return 0;} static int 

5、send_msg(struct sock *sk, int cmd, void __user *user, int *len){    int ret = 0;    printk(KERN_INFO "sockopt: send_msg()");     if (cmd == SOCKET_OPS_GET)    {        ret = copy_to_user(user, KMSG, KMSG_LEN);        printk("send_msg: umsg = %s. ret = %d. success", KMSG, ret);

6、        }    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_MODUL

7、E,}; static int __init init_sockopt(void){    printk(KERN_INFO "sockopt: init_sockopt()");     return nf_register_sockopt(&test_sockops);} static void __exit fini_sockopt(void){    printk(KERN_INFO "sockopt: fini_sockopt()");     nf_unregister_sockopt(&test_sockops);} module_i

8、nit(init_sockopt); module_exit(fi

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。