+ -
当前位置:首页 → 问答吧 → 用netlink从内核空间向用户空间传数据时遇到的问题!

用netlink从内核空间向用户空间传数据时遇到的问题!

时间:2009-01-07

来源:互联网

大家好,在用netlink进行内核空间向用户空间传送数据时,用户空间有反应但一直没有接到实际的数据(rcvlen一直等于15(也就是getbuf数据的大小,可是getbuf一直为空))。由此看来内核空间和用户空间的连接没有问题,可是在传送数据时有问题。
主要程序如下:

内核空间的的发送程序:
/*一个中断处理程序,向应用程序发送数据*/
irqreturn_t irq_handler(unsigned long pid_num)
{
int ret;
DWORD size;
sk_buff_data_t old_tail;
struct sk_buff *skb = NULL;// 别忘了初始化
struct nlmsghdr *nlh = NULL;
void *data;
unsigned char *data_send = "hello!";
/*计算消息总长:消息首部加上数据加度*/
size = NLMSG_SPACE(6);
/*分配一个新的套接字缓存*/
skb = alloc_skb(size, GFP_KERNEL);
if(!skb)
{
        printk("skb failed!\n");
        return -1;
}
old_tail = skb->tail;
/*初始化一个netlink消息首部*/
nlh = NLMSG_PUT(skb,0,0, 0,size));
nlh->nlmsg_flags = 0;
/*跳过消息首部,指向数据区*/
data = NLMSG_DATA(nlh);
memcpy(data,data_send,6);
nlh->nlmsg_len = skb->tail - old_tail;
ret = netlink_unicast(yaffs_sock, skb,pid_num, MSG_DONTWAIT);
if(ret<0)
        return -1;
kfree_skb(skb);
#endif
return IRQ_HANDLED;
}

用户空间的用于接收的程序:
char getbuf[15];
pid_num=getpid();
printf("pid_num=%ld\n",pid_num);
        // 20 应该与自己的在内核中include/linux/netlink.h中的自己定义的协议类型一致
       skfd = socket(AF_NETLINK, SOCK_RAW, 20);
       if(skfd < 0)
       {
              printf("can not create a netlink socket\n");
              exit(1);
       }
       memset(&local, 0, sizeof(local));
       local.nl_family = AF_NETLINK;
       local.nl_pid = pid_num;          /*设置pid为自己的pid值*/
       local.nl_groups = 0;
       /*绑定套接字 成功则返回0 否则返回-1 */
       if(bind(skfd, (struct sockaddr*)&local, sizeof(local)) < 0)
       {
              printf("bind");
              return -1;
        }
       memset(&kpeer, 0, sizeof(kpeer));
       kpeer.nl_family = AF_NETLINK;
       kpeer.nl_pid = 0;
       kpeer.nl_groups = 0;
while(1)
{
 /*接收内核空间返回的数据*/
 rcvlen = recvfrom(skfd, getbuf,sizeof(getbuf), 0, (struct sockaddr*)&kpeer, &kpeerlen);
 /*处理接收到的数据*/
 printf("rcvlen==%d\n",rcvlen);
 printf("getbuf==%s\n",getbuf);
}
close(skfd)


各位帮忙看一下,是不是哪儿没有注意到啊,实际上没有把数据传上去!
谢谢了!      

作者: xiabeizi   发布时间: 2009-01-07

请达人指点一二吧,已经困扰我好几天了!      

作者: xiabeizi   发布时间: 2009-01-08

recvfrom应该是从binding的socket获取数据报吧      

作者: AIKO_sex   发布时间: 2009-01-08

热门下载

更多