- 论坛徽章:
- 0
|
大家好,在用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)
各位帮忙看一下,是不是哪儿没有注意到啊,实际上没有把数据传上去!
谢谢了! |
|