当前位置: 技术问答>linux和unix
用netlink从内核空间向用户空间传送数据为何失败!
来源: 互联网 发布时间:2016-05-17
本文导语: 大家好! 现在正在做一个通过无线网络进行文件传输方面的项目,建立一个内核线程以让内核态接收函数在后台一直运行,而且用户态也一直用recvmsg进行监听,待到数据到来之时用netlink通知用户空间的程序把接收...
大家好!
现在正在做一个通过无线网络进行文件传输方面的项目,建立一个内核线程以让内核态接收函数在后台一直运行,而且用户态也一直用recvmsg进行监听,待到数据到来之时用netlink通知用户空间的程序把接收到的数据写入文件。可是在接收时一直接收不到数据?这是怎么回事呢?原来用在用户态建立守护进程以让内核态的接收函数在后台一直运行时,可以接收到正常的数据。难道是因为是由于建立内核线程的原因么?
下面是数据到来时用于向用户空间通知的函数实现:
struct sk_buff *skb = NULL;
struct nlmsghdr *nlh = NULL;
skb = alloc_skb(NLMSG_SPACE(MAX_PAYLOAD),GFP_KERNEL);
nlh = (struct nlmsghdr *)skb->data;
nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
nlh->nlmsg_pid = 0; /* from kernel */
nlh->nlmsg_flags = 0;
nlh = (struct nlmsghdr *) skb_put(skb, NLMSG_SPACE(MAX_PAYLOAD));
NETLINK_CB(skb).pid = 0; /* from kernel */
/* to mcast group 1nlmsg_len = NLMSG_LENGTH(MAX_PAYLOAD);
试试
现在正在做一个通过无线网络进行文件传输方面的项目,建立一个内核线程以让内核态接收函数在后台一直运行,而且用户态也一直用recvmsg进行监听,待到数据到来之时用netlink通知用户空间的程序把接收到的数据写入文件。可是在接收时一直接收不到数据?这是怎么回事呢?原来用在用户态建立守护进程以让内核态的接收函数在后台一直运行时,可以接收到正常的数据。难道是因为是由于建立内核线程的原因么?
下面是数据到来时用于向用户空间通知的函数实现:
struct sk_buff *skb = NULL;
struct nlmsghdr *nlh = NULL;
skb = alloc_skb(NLMSG_SPACE(MAX_PAYLOAD),GFP_KERNEL);
nlh = (struct nlmsghdr *)skb->data;
nlh->nlmsg_len = NLMSG_SPACE(MAX_PAYLOAD);
nlh->nlmsg_pid = 0; /* from kernel */
nlh->nlmsg_flags = 0;
nlh = (struct nlmsghdr *) skb_put(skb, NLMSG_SPACE(MAX_PAYLOAD));
NETLINK_CB(skb).pid = 0; /* from kernel */
/* to mcast group 1nlmsg_len = NLMSG_LENGTH(MAX_PAYLOAD);
试试