- 论坛徽章:
- 1
|
- #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[128];
- 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 这个函数中输出接收到的字节数也是正确的,但是输出接收内容时怎么没有东西? |
|