免费注册 查看新帖 |

Chinaunix

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

用netlink从内核空间向用户空间传数据时遇到的问题! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-07 22:03 |只看该作者 |倒序浏览
大家好,在用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;
}

用户空间的用于接收的程序:
static int skfd, kpeerlen, rcvlen;
struct sockaddr_nl local;
struct sockaddr_nl kpeer;
unsigned long pid_num;
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)


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

论坛徽章:
0
2 [报告]
发表于 2009-01-08 10:11 |只看该作者
大家帮忙指点一二吧,确实感觉有困难!

论坛徽章:
0
3 [报告]
发表于 2009-01-08 13:49 |只看该作者
看看这个,内核板块的精华贴

http://linux.chinaunix.net/bbs/thread-1031932-1-1.html

论坛徽章:
0
4 [报告]
发表于 2009-01-08 22:22 |只看该作者
呵,多谢楼上的朋友!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP