内核中接收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 这个函数中输出接收到的字节数也是正确的,但是输出接收内容时怎么没有东西? 感觉好像是程序有问题,打印了一下msg_iov->iov_len, 发现是0 自己定。。。。。。 发现在经过kernel_recvmsg后,vec.iov_base 指针不在指向刚开始指向的buffer,有谁能给解释下吗? 你是从哪里看出来改变了。。??程序中没有打印vec.iov_base 的吧回复 4# goingstudy
回复 5# 黎明748
帖子里的代码没有打印,我自己调试时打印出来的发现是变了
页:
[1]