当前位置: 技术问答>linux和unix
【netlink】recvmsg只收到了个报头,却没数据
来源: 互联网 发布时间:2017-05-04
本文导语: 我自己注册的netlink协议,从用户层将数据发往内核一切正常,不过要是从内核往用户层发数据的话(用netlink_unicast),用户层收得到数据,但是recvmsg返回的数值显示它收到的数据比内核发送的数据少。 补充:刚刚测...
我自己注册的netlink协议,从用户层将数据发往内核一切正常,不过要是从内核往用户层发数据的话(用netlink_unicast),用户层收得到数据,但是recvmsg返回的数值显示它收到的数据比内核发送的数据少。
补充:刚刚测了下,nlmsg报头的长度是16个字节,然后NLMSG_DATA所指向的数据缓冲区的长度是12个字节,在内核层发送时,netlink_unicast返回的字节数是28个字节,而在用户层接收数据时,recvmsg返回的字节数是16个字节,这大概能证明用户层只收到了nlmsg的报头,却没有收到报头后面的数据吧,在用户层通过NLMSG_DATA(nh)->nlmsg_len == 28,但是不知道为什么数据部分根本没从内核层的nlh复制到用户层的nh中。
一下是内核发送数据的代码
然后用户层接收数据的代码如下
求助路过的大牛
大概会是哪里出的问题,给个思路也行。。。。。
对了,内核版本是2.6.32-358.el6.i686
发行版scientific linux 6
补充:刚刚测了下,nlmsg报头的长度是16个字节,然后NLMSG_DATA所指向的数据缓冲区的长度是12个字节,在内核层发送时,netlink_unicast返回的字节数是28个字节,而在用户层接收数据时,recvmsg返回的字节数是16个字节,这大概能证明用户层只收到了nlmsg的报头,却没有收到报头后面的数据吧,在用户层通过NLMSG_DATA(nh)->nlmsg_len == 28,但是不知道为什么数据部分根本没从内核层的nlh复制到用户层的nh中。
一下是内核发送数据的代码
static void kernel_send_msg(struct frwl_msg m)//frwl_msg是我自己定义的
{
struct sk_buff *nl_skb;
nl_skb = alloc_skb(NLMSG_SPACE(sizeof(struct frwl_msg)),GFP_ATOMIC);
if(nl_skb == NULL)
{
printk(KERN_ERR "alloc skb failedn");
return;
}
NETLINK_CB(nl_skb).pid = 0;
NETLINK_CB(nl_skb).dst_group = 0;
nlh = nlmsg_put(nl_skb,0,0,0,
NLMSG_SPACE(sizeof(struct frwl_msg))-sizeof(struct nlmsghdr),0);
memcpy(NLMSG_DATA(nlh),&m,sizeof(struct frwl_msg));
printk("sizeof nh:%dn",sizeof(*nlh));//16
printk("sizeof data:%dn",sizeof(*((struct frwl_msg *)NLMSG_DATA(nlh))));//12
debug_frwl_print(*((struct frwl_msg *)NLMSG_DATA(nlh)),"in send");//这一句的输出表明数据已经成功地复制到nlh的缓冲区里了
int report = netlink_unicast(kernel_sk,nl_skb,pid,MSG_DONTWAIT);
printk("report = %dn",report);//输出28
}
然后用户层接收数据的代码如下
void interface_rcv_msg(struct frwl_msg * buff)
{
struct nlmsghdr *nh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_PAYLOAD));//MAX_PAYLOAD==2048
struct iovec iov2 = { nh, sizeof(*nh) };
struct msghdr msg = {
(void *)&nl_dest_addr,
sizeof(nl_dest_addr),
&iov2,1,NULL,0,0};
printf("sizeof nlh:%dn",sizeof(*nh));//输出16
int len = recvmsg(interface_sk,&msg,0);
printf("rcvlen=%dn datalen=%dn",len,nh->nlmsg_len);//rcvlen=16 datalen=28
debug_frwl_print(*((struct frwl_msg *)NLMSG_DATA(nh)));//这一句的输出表明nh的缓冲区里一片空白。。。。。。。。。。。
求助路过的大牛
大概会是哪里出的问题,给个思路也行。。。。。
对了,内核版本是2.6.32-358.el6.i686
发行版scientific linux 6
|
void debug_frwl_print(struct frwl_msg *m);
debug_frwl_print(&buff);
一般是这么定义么这用的..
不过buf已经 是指针了
你那边直接
debug_frwl_print(buff);这么就行了
debug_frwl_print(&buff);
一般是这么定义么这用的..
不过buf已经 是指针了
你那边直接
debug_frwl_print(buff);这么就行了
|
应该是吧,只需一个指针大小
压栈的时候减少拷贝
压栈的时候减少拷贝
|
这年头还有结构体值传递的?
debug_frwl_print 的声明是怎么样的?
debug_frwl_print(char *buf); ?
|
还真有那么写的..
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。