- 論壇徽章:
- 42
|
本帖最后由 laputa73 于 2013-12-10 12:06 編輯
在<Go語(yǔ)言編程>中有icmp ping的例子,不過(guò)實(shí)際測(cè)試不通過(guò)....這個(gè)有空研究一下源碼再看.
--補(bǔ)充,原文代碼未考慮ipv4的包頭長(zhǎng)度
_, err = conn.Read(msg[0:]) 改為
_, err = conn.Read(msg[20:])
在網(wǎng)找到了一個(gè)可用的模塊,還可以支持ipv6.
http://golangtc.com/t/526e1f8b320b522433000003
https://github.com/paulstuart/ping/blob/master/ping.go
利用協(xié)程實(shí)現(xiàn)并發(fā)ping測(cè)試- /*gorouting版本的并行ping */
- package main
- import (
- "ping"
- "fmt"
- "time"
- //"os"
- "strconv"
- )
- var fin chan string; //用于實(shí)現(xiàn)joinall
- //go沒(méi)有pop/shift操作,只能自己計(jì)數(shù)
- var cur int
- /*定義協(xié)程
- ping單個(gè)目標(biāo)
- 輸入:目標(biāo)ip/域名
- 輸出:結(jié)果, 時(shí)延
- */
- 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() {
-
- //創(chuàng)建隊(duì)列
- fin = make(chan string)
- //數(shù)組賦值
- for i := 0; i < len(iplist); i++ {
- iplist[i]="192.168.99."+strconv.Itoa(i+1)
-
- }
-
- //控制并發(fā)
- cocurrent := 100
- cur =0
- for j := 0; j < cocurrent; j++ {
- doit()
- }
-
-
-
- //等待結(jié)束
- for i := 0; i < len(iplist); i++ {
-
- <-fin
- //fmt.Println(ip,"joined")
- }
-
- }
復(fù)制代碼 |
|