用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)
各位帮忙看一下,是不是哪儿没有注意到啊,实际上没有把数据传上去!
谢谢了!
主要程序如下:
内核空间的的发送程序:
/*一个中断处理程序,向应用程序发送数据*/
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28