免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2753 | 回复: 5
打印 上一主题 下一主题

[网络子系统] 内核中接收udp包的问题 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-07 11:07 |只看该作者 |倒序浏览
  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/socket.h>
  4. #include <net/sock.h>

  5. static struct socket *sock;
  6. static struct work_struct work;

  7. static int udp_recvfrom(struct socket *sock, void *buff, size_t len,
  8.                 unsigned flags, struct sockaddr *addrn)
  9. {
  10.         struct kvec vec;
  11.         struct msghdr msg;
  12.         int n = 0;

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

  15.         while (n == 0) {
  16.                 n = kernel_recvmsg(sock, &msg, &vec, 1, 128, 0);
  17.                 if (n < 0) {
  18.                         printk("kernel_rcvmsg error\n");
  19.                         return -1;
  20.                 }
  21.                 printk("%d\n", n);
  22.         }
  23.         printk("number block:%u\n", (unsigned int)msg.msg_iovlen);
  24.         printk("%s\n", (char *)((msg.msg_iov)->iov_base));
  25.         return n;
  26. }

  27. static char buffer[128];
  28. static void recvmsg(void *dummy)
  29. {
  30.         int n;
  31.         struct sockaddr_in addr;
  32.         memset(&addr, 0x00, sizeof(addr));
  33.         addr.sin_family = AF_INET;
  34.         addr.sin_port = htons(1000);
  35.         addr.sin_addr.s_addr = INADDR_ANY;
  36.         if (sock->ops->bind(sock, (struct sockaddr *)&addr, sizeof(addr))) {
  37.                 printk("failed to bind socket to port %d.\n", addr.sin_port);
  38.                 return ;
  39.         }
  40.         n = udp_recvfrom(sock, buffer, 128, 0, (struct sockaddr *)&addr);
  41. }

  42. static int recvmsg_init(void)
  43. {
  44.         INIT_WORK(&work, recvmsg);
  45.         if (sock_create_kern(PF_INET, SOCK_DGRAM, 0, &sock)) {
  46.                 printk("failed to create socket.\n");
  47.                 return -1;
  48.         }
  49.         schedule_work(&work);
  50.         return 0;
  51. }

  52. static void recvmsg_exit(void)
  53. {
  54.         sock_release(sock);
  55. }

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

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
2 [报告]
发表于 2014-07-07 11:26 |只看该作者
感觉好像是程序有问题,打印了一下msg_iov->iov_len, 发现是0

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
3 [报告]
发表于 2014-07-07 15:23 |只看该作者
自己定。。。。。。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
4 [报告]
发表于 2014-07-08 14:50 |只看该作者
发现在经过kernel_recvmsg后,vec.iov_base 指针不在指向刚开始指向的buffer,有谁能给解释下吗?

论坛徽章:
0
5 [报告]
发表于 2014-07-09 00:30 |只看该作者
你是从哪里看出来改变了。。??程序中没有打印vec.iov_base 的吧回复 4# goingstudy


   

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-12-20 06:20:00
6 [报告]
发表于 2014-07-09 09:09 |只看该作者
回复 5# 黎明748
帖子里的代码没有打印,我自己调试时打印出来的发现是变了

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP