laputa73 发表于 2013-11-26 16:54

[练习]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")
}

}

__b1ueguy__ 发表于 2013-11-30 22:10

:lol看看这是难点
页: [1]
查看完整版本: [练习]go版的并发ping