mousexqshe 发表于 2014-12-16 09:58

netlink接收失败的问题

大家好,现用netlink进行内核与用户通信,用户程序循环接收内核发过来的消息。
            但是用户程序时常会出现接收失败的情况,失败时的现象是“No buffer space available”,查了一下资料,暂时还没什么结果,请哪位能指点一下,谢谢了。(内核每次发过来的信息长度大概为10个字节左右,偶尔会有一笔500个字节的信息)
            代码如下:
                     #define BUFFER_SIZE_RECV      1024

                                 int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);
                                 pid = fork();
                                 if(0 == pid)
                                 {
                                    while(1)
                                    {                                                                                                                                    
                                                    memset(nlh, 0, NLMSG_SPACE(BUFFER_SIZE_RECV));      
                                                    iov.iov_base = (void *)nlh;
                                                    iov.iov_len = NLMSG_SPACE(BUFFER_SIZE_RECV);                                             
                                                    memset(&msg, 0, sizeof(msg));
                                                    memset(&dest_addr, 0, sizeof(dest_addr));
                                                    msg.msg_name = (void *)&dest_addr;
                                                    msg.msg_namelen = sizeof(dest_addr);
                                                    msg.msg_iov = &iov;
                                                    msg.msg_iovlen = 1;
                                                    msg.msg_control = NULL;                        
                                                    msg.msg_controllen = 0;                        
                                                    msg.msg_flags = 0;                                       
                                                                                                         
                                                    res= recvmsg(sock_fd, &msg, 0);                              
                                                    if(0 >= Recvflag)
                                                    {
                                                            printf("res= %d\terrno = %d\n", res, errno);                  //出错时res=-1,errno=105
                                                    }      

                                                    ...
                                    }
                                     }

                  这段代码是在子进程中执行的,每次执行完之后用exit退出,当有新的连接进来的时候重新产生一个子进程,处理以上的流程。

mousexqshe 发表于 2014-12-16 14:27

大家帮帮忙啊!

hnwyllmm 发表于 2014-12-16 14:34

接收缓冲区设置大一点试试,参考:
zhangzhenyuan163.blog.163.com/blog/static/85819389201282312415539/
页: [1]
查看完整版本: netlink接收失败的问题