免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 瀚海书香

CU线上连载讨论一从内核源码的角度来剖析Linux网络部分 [复制链接]

论坛徽章:
0
发表于 2011-08-10 18:12 |显示全部楼层
希望楼主继续分享经验。

论坛徽章:
0
发表于 2011-08-11 08:57 |显示全部楼层
来听课了.期待

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2011-08-11 10:29 |显示全部楼层
本帖最后由 瀚海书香 于 2011-08-11 10:32 编辑

回复 1# 瀚海书香
经常会用到在内核发送数据包的情况,刚才看到heray1990写了一个通过dev_queue_xmit发送的数据包的例子,这里也贴一个通过kernel_sendmsg发送数据包的例子。
  1. /*
  2. * Send Udp packet Demo
  3. * Authors: Tingwei Liut <tingw.liu@gmail.com>
  4. * 2011-08-11 08:38:39
  5. *
  6. * Any bugs please report <tingw.liu@gmail.com>
  7. */
  8. #include <linux/module.h>
  9. #include <net/ip.h>
  10. #include <net/sock.h>
  11. #include <linux/in.h>
  12. #include <linux/udp.h>
  13. #include <linux/net.h>
  14. #include <linux/inet.h>

  15. MODULE_LICENSE("GPL");
  16. MODULE_AUTHOR("tingw.liu@gmail.com");
  17. char *sendstring="test string";
  18. char *dip="192.168.0.1";
  19. unsigned short dport=8000;
  20. module_param(sendstring,charp,0644);
  21. module_param(dip,charp,0644);
  22. module_param(dport,ushort,0644);
  23. struct sockaddr_in recvaddr;
  24. struct socket *sock;
  25. static int send_msg(struct socket *sock, char *buffer, size_t length)
  26. {
  27.         struct msghdr        msg;
  28.         struct kvec        iov;
  29.         int                len;
  30.        
  31.         memset(&msg,0,sizeof(msg));
  32.         msg.msg_flags = MSG_DONTWAIT|MSG_NOSIGNAL;       
  33.         msg.msg_name = (struct sockaddr *)&recvaddr;
  34.         msg.msg_namelen = sizeof(recvaddr);

  35.         iov.iov_base     = (void *)buffer;
  36.         iov.iov_len      = length;

  37.         len = kernel_sendmsg(sock, &msg, &iov, 1, length);
  38.         return len;
  39. }

  40. static void make_daddr()
  41. {
  42.         memset(&recvaddr,0,sizeof(recvaddr));
  43.         recvaddr.sin_family = AF_INET;
  44.         recvaddr.sin_port = htons(dport);
  45.         recvaddr.sin_addr.s_addr = in_aton(dip);
  46. }
  47. static void make_socket(void)
  48. {
  49.         if(sock_create_kern(PF_INET, SOCK_DGRAM, IPPROTO_UDP, &sock) < 0){
  50.                 printk(KERN_ALERT "sock_create_kern error\n");
  51.                 sock = NULL;
  52.                 return;
  53.         }
  54.         if(sock->ops->connect(sock, (struct sockaddr*)&recvaddr,
  55.                                    sizeof(struct sockaddr), 0) < 0){
  56.                 printk(KERN_ALERT "sock connect error\n");
  57.                 goto error;
  58.         }
  59.         return;
  60.   error:
  61.         sock_release(sock);
  62.         sock = NULL;
  63.         return;
  64. }
  65. static int __init send_udp_init(void)
  66. {
  67.         make_socket();
  68.         if(sock == NULL)
  69.                  return -1;
  70.         make_daddr();
  71.         send_msg(sock,sendstring,strlen(sendstring));
  72.         return 0;
  73. }
  74. static void __exit send_udp_exit(void)
  75. {
  76.         if(sock)
  77.                 sock_release(sock);
  78.         return;
  79. }
  80. module_init(send_udp_init);
  81. module_exit(send_udp_exit);
复制代码

评分

参与人数 1可用积分 +6 收起 理由
Godbach + 6 赞一个!

查看全部评分

论坛徽章:
0
发表于 2011-08-11 11:09 |显示全部楼层
学习了!原来这就是内核编程!谢谢{:2_176:}  盼更新

论坛徽章:
0
发表于 2011-08-11 12:27 |显示全部楼层
回复 1# 瀚海书香

支持!

论坛徽章:
0
发表于 2011-08-11 13:55 |显示全部楼层
看来还是自己买吧。

论坛徽章:
0
发表于 2011-08-11 14:12 |显示全部楼层
回复  瀚海书香
经常会用到在内核发送数据包的情况,刚才看到heray1990写了一个通过dev_queue_xmit发送的 ...
瀚海书香 发表于 2011-08-11 10:29



    内核编程,有点复杂,努力。。。

论坛徽章:
0
发表于 2011-08-11 15:24 |显示全部楼层
凑热闹人员来到

论坛徽章:
0
发表于 2011-08-11 16:04 |显示全部楼层
赞一个..

论坛徽章:
0
发表于 2011-08-12 08:50 |显示全部楼层
非常好的活动!顶!)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP