[练习]go版的并发ping
本帖最后由 laputa73 于 2013-12-10 12:06 编辑在<Go语言编程>中有icmp ping的例子,不过实际测试不通过....这个有空研究一下源码再看.
--补充,原文代码未考虑ipv4的包头长度
_, err = conn.Read(msg)改为
_, err = conn.Read(msg)
在网找到了一个可用的模块,还可以支持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++
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 string
func main() {
//创建队列
fin = make(chan string)
//数组赋值
for i := 0; i < len(iplist); i++ {
iplist="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")
}
} :lol看看这是难点
页:
[1]