当前位置:  技术问答>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中。
一下是内核发送数据的代码


    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 的声明是怎么样的?
debug_frwl_print(char *buf); ?

|

还真有那么写的..

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • netlink怎么与内核通信?
  • netlink 的问题
  • netlink的问题,很奇怪,请教高手。
  • (请来拿分)关于netlink 中的 kfree_skb的问题!
  • (来拿分了)谁提供一个简单的netlink的程序? 要求是内核空间发往用户空间的。
  • 内核netlink发送接收数据问题
  • 关于netlink的问题
  • linux-2.6.24下netlink使用问题
  • 用netlink进行用户态和内核态通信,想传两个整数进去,该如何操作,我只会发个字符串进去,求关键部位代码 iis7站长之家
  • 用netlink从内核空间向用户空间传送数据为何失败!
  • netlink,中用户使用sendto有什么意义
  • 用netlink进行用户态和内核态通信,想传两个整数进去,该如何操作,我只会发个字符串进去,求关键部位代码
  • linux2.6.25版本netlink造成内核panic


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,