Chinaunix

标题: 使用Netlink时的问题 [打印本页]

作者: ustcwizard    时间: 2012-07-22 16:36
标题: 使用Netlink时的问题
本帖最后由 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函数中,则失败!

请教各位,原因是什么?
作者: cdtits    时间: 2012-07-22 19:39
用户态代码发到驱动板块干嘛?
作者: ustcwizard    时间: 2012-07-22 21:00
是和Netlink有关系的回复 2# cdtits


   
作者: cdtits    时间: 2012-07-22 21:25
回复 3# ustcwizard


    貌似一般来说只要通过外设的东西,都要通过驱动吧。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2