- 论坛徽章:
- 42
|
本帖最后由 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测试- /*gorouting版本的并行ping */
- package main
- import (
- "ping"
- "fmt"
- "time"
- //"os"
- "strconv"
- )
- var fin chan string; //用于实现joinall
- //go没有pop/shift操作,只能自己计数
- var cur int
- /*定义协程
- ping单个目标
- 输入:目标ip/域名
- 输出:结果, 时延
- */
- func doit(){
- if cur >= len(iplist){
- return
- }
- ip:=iplist[cur]
- cur++
- go pingr(ip,1000)
- }
- func pingr(host string,timeout int){
- t1:=time.Now().UnixNano()
- alive,err:=ping.Ping(host,timeout)
- //alive,err:=true,0
- t2:=time.Now().UnixNano()
- fmt.Println(host,alive,(t2-t1)/1000000,err);
- fin <- host
- doit()
- }
- //定义iplist
- var iplist [253]string
- func main() {
-
- //创建队列
- fin = make(chan string)
- //数组赋值
- for i := 0; i < len(iplist); i++ {
- iplist[i]="192.168.99."+strconv.Itoa(i+1)
-
- }
-
- //控制并发
- cocurrent := 100
- cur =0
- for j := 0; j < cocurrent; j++ {
- doit()
- }
-
-
-
- //等待结束
- for i := 0; i < len(iplist); i++ {
-
- <-fin
- //fmt.Println(ip,"joined")
- }
-
- }
复制代码 |
|