免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
42
19周年集字徽章-周
日期:2019-10-14 14:35:31平安夜徽章
日期:2015-12-26 00:06:30数据库技术版块每日发帖之星
日期:2015-12-01 06:20:002015亚冠之首尔
日期: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:34IT运维版块每日发帖之星
日期:2016-01-27 06:20:0015-16赛季CBA联赛之新疆
日期:2016-06-07 14:10:01
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 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
2 [报告]
发表于 2013-11-30 22:10 |只看该作者
看看这是难点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP