免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1577 | 回复: 3
打印 上一主题 下一主题

使用Netlink时的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-22 16:36 |只看该作者 |倒序浏览
本帖最后由 ustcwizard 于 2012-07-22 16:38 编辑

一个Netlink套接字的用户态代码Demo:

#include <sys/socket.h>

#include <linux/netlink.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>



#define NETLINK_USER 31



#define MAX_PAYLOAD 1024



//struct msghdr msg;



int main(int argc, char *argv[])

{

        struct sockaddr_nl src_addr, dest_addr;

        struct nlmsghdr *nlh = NULL;

        struct msghdr msg;

        struct iovec iov;

        int sock_fd;



        sock_fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_USER);

        if( sock_fd<0 )

                return -1;



        memset(&src_addr, 0, sizeof(src_addr));

        src_addr.nl_family = AF_NETLINK;

        src_addr.nl_pid = getpid();

       

        bind(sock_fd, (struct sockaddr *)&src_addr, sizeof(src_addr));



        memset(&dest_addr, 0, sizeof(dest_addr));

        dest_addr.nl_family = AF_NETLINK;

        dest_addr.nl_pid = 0;

        dest_addr.nl_groups = 0;



        nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));

        memset(nlh, 0, NLMSG_SPACE(MAX_PAYLOAD));

        nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);

        nlh->nlmsg_pid = getpid();

        nlh->nlmsg_flags = 0;

        strcpy(NLMSG_DATA(nlh), "Debug Hello, Kernel!");



        iov.iov_base = (void *)nlh;

        iov.iov_len = nlh->nlmsg_len;

        msg.msg_name = (void *)&dest_addr;

        msg.msg_namelen = sizeof(dest_addr);

        msg.msg_iov = &iov;

        msg.msg_iovlen = 1;



        printf("Sending msg to kernel!\n");

        sendmsg(sock_fd, &msg, 0);

       

        printf("Waiting for message from kernel\n");



        recvmsg(sock_fd, &msg, 0);

        printf("Received msg: %s\n", (char *)NLMSG_DATA(nlh));



        free( nlh );

        nlh = NULL;



        close(sock_fd);



        return 0;

}

如果把struct msghdr msg定义为全局变量,则成功,若定义为局部变量,即放在main函数中,则失败!

请教各位,原因是什么?

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
2 [报告]
发表于 2012-07-22 19:39 |只看该作者
用户态代码发到驱动板块干嘛?

论坛徽章:
0
3 [报告]
发表于 2012-07-22 21:00 |只看该作者
是和Netlink有关系的回复 2# cdtits


   

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
4 [报告]
发表于 2012-07-22 21:25 |只看该作者
回复 3# ustcwizard


    貌似一般来说只要通过外设的东西,都要通过驱动吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP