goingstudy 发表于 2014-07-07 11:07

内核中接收udp包的问题

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/socket.h>
#include <net/sock.h>

static struct socket *sock;
static struct work_struct work;

static int udp_recvfrom(struct socket *sock, void *buff, size_t len,
                unsigned flags, struct sockaddr *addrn)
{
        struct kvec vec;
        struct msghdr msg;
        int n = 0;

        vec.iov_base = buff;
        vec.iov_len = len;

        while (n == 0) {
                n = kernel_recvmsg(sock, &msg, &vec, 1, 128, 0);
                if (n < 0) {
                        printk("kernel_rcvmsg error\n");
                        return -1;
                }
                printk("%d\n", n);
        }
        printk("number block:%u\n", (unsigned int)msg.msg_iovlen);
        printk("%s\n", (char *)((msg.msg_iov)->iov_base));
        return n;
}

static char buffer;
static void recvmsg(void *dummy)
{
        int n;
        struct sockaddr_in addr;
        memset(&addr, 0x00, sizeof(addr));
        addr.sin_family = AF_INET;
        addr.sin_port = htons(1000);
        addr.sin_addr.s_addr = INADDR_ANY;
        if (sock->ops->bind(sock, (struct sockaddr *)&addr, sizeof(addr))) {
                printk("failed to bind socket to port %d.\n", addr.sin_port);
                return ;
        }
        n = udp_recvfrom(sock, buffer, 128, 0, (struct sockaddr *)&addr);
}

static int recvmsg_init(void)
{
        INIT_WORK(&work, recvmsg);
        if (sock_create_kern(PF_INET, SOCK_DGRAM, 0, &sock)) {
                printk("failed to create socket.\n");
                return -1;
        }
        schedule_work(&work);
        return 0;
}

static void recvmsg_exit(void)
{
        sock_release(sock);
}

module_init(recvmsg_init);
module_exit(recvmsg_exit);
MODULE_LICENSE("GPL");
上面的代码是内核中接收udp包的程序,我用tcpdump抓包证明确实发送成功,然后在udp_recvfrom 这个函数中输出接收到的字节数也是正确的,但是输出接收内容时怎么没有东西?

goingstudy 发表于 2014-07-07 11:26

感觉好像是程序有问题,打印了一下msg_iov->iov_len, 发现是0

goingstudy 发表于 2014-07-07 15:23

自己定。。。。。。

goingstudy 发表于 2014-07-08 14:50

发现在经过kernel_recvmsg后,vec.iov_base 指针不在指向刚开始指向的buffer,有谁能给解释下吗?

黎明748 发表于 2014-07-09 00:30

你是从哪里看出来改变了。。??程序中没有打印vec.iov_base 的吧回复 4# goingstudy


   

goingstudy 发表于 2014-07-09 09:09

回复 5# 黎明748
帖子里的代码没有打印,我自己调试时打印出来的发现是变了

   
页: [1]
查看完整版本: 内核中接收udp包的问题