免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4712 | 回复: 1

[其他] [练习]go版的并发ping [复制链接]

论坛徽章:
39
技术图书徽章
日期:2018-08-21 13:30:492015亚冠之首尔
日期:2015-11-04 22:25:43IT运维版块每日发帖之星
日期:2015-08-17 06:20:00寅虎
日期:2014-06-04 16:25:27狮子座
日期:2014-05-12 11:00:00辰龙
日期:2013-12-20 17:07:19射手座
日期:2013-10-24 21:01:23CU十二周年纪念徽章
日期:2013-10-24 15:41:34数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00平安夜徽章
日期:2015-12-26 00:06:30技术图书徽章
日期:2018-08-21 13:30:242016科比退役纪念章
日期:2018-03-07 11:23:33
发表于 2013-11-26 16:54 |显示全部楼层
本帖最后由 laputa73 于 2013-12-10 12:06 编辑

在<Go语言编程>中有icmp ping的例子,不过实际测试不通过....这个有空研究一下源码再看.

--补充,原文代码未考虑ipv4的包头长度
_, err = conn.Read(msg[0:])  改为
_, err = conn.Read(msg[20:])


在网找到了一个可用的模块,还可以支持ipv6.

http://golangtc.com/t/526e1f8b320b522433000003

https://github.com/paulstuart/ping/blob/master/ping.go

利用协程实现并发ping测试
  1. /*gorouting版本的并行ping */

  2. package main
  3. import (
  4. "ping"
  5. "fmt"
  6. "time"
  7. //"os"
  8. "strconv"
  9. )

  10. var fin chan string; //用于实现joinall

  11. //go没有pop/shift操作,只能自己计数
  12. var cur int


  13. /*定义协程
  14. ping单个目标
  15. 输入:目标ip/域名
  16. 输出:结果, 时延
  17. */
  18. func doit(){
  19.         if cur >= len(iplist){
  20.                 return
  21.         }
  22.         ip:=iplist[cur]
  23.         cur++
  24.         go pingr(ip,1000)
  25. }


  26. func pingr(host string,timeout int){
  27.         t1:=time.Now().UnixNano()
  28.         alive,err:=ping.Ping(host,timeout)
  29.         //alive,err:=true,0
  30.         t2:=time.Now().UnixNano()
  31.         fmt.Println(host,alive,(t2-t1)/1000000,err);
  32.         fin <- host
  33.         doit()
  34. }


  35. //定义iplist
  36. var iplist [253]string

  37. func main() {

  38. //创建队列
  39. fin = make(chan string)


  40.   //数组赋值
  41. for i := 0; i < len(iplist); i++ {
  42.                 iplist[i]="192.168.99."+strconv.Itoa(i+1)
  43.                
  44. }       


  45. //控制并发
  46. cocurrent := 100
  47. cur =0
  48. for j := 0; j < cocurrent; j++ {
  49.         doit()
  50. }



  51. //等待结束
  52. for i := 0; i < len(iplist); i++ {
  53.                
  54.                   <-fin
  55.            //fmt.Println(ip,"joined")
  56. }

  57. }
复制代码

论坛徽章:
0
发表于 2013-11-30 22:10 |显示全部楼层
看看这是难点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

基于案例的 SQL 优化实战训练营

讲师:中电福富特级专家梁敬彬,参与本次课程培训,你将收获:
1. 能编写出较为高效的 SQL;
2. 能解决70%以上的数据库常见优化问题;
3. 能得到老师提供的高效的相关工具和解决方案;
4. 能举一反三,收获不仅仅是 SQL 优化。
现在购票享受8.8折优惠!
----------------------------------------
优惠时间:2019年3月20日前

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP