Skip to content

Commit 6a458ee

Browse files
exec: add ping measure tool
1 parent c35eb81 commit 6a458ee

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed

exec/misc/ping-measure/main.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"crypto/rand"
6+
"fmt"
7+
"log"
8+
"network-measure/tool"
9+
"os"
10+
11+
"golang.org/x/sync/semaphore"
12+
)
13+
14+
var dataStorage [56]byte
15+
16+
type measureResult struct {
17+
addr string
18+
received int
19+
latency float64
20+
score float64
21+
}
22+
23+
const concurrency = 16
24+
25+
func main() {
26+
_, _ = rand.Read(dataStorage[:])
27+
sema := semaphore.NewWeighted(concurrency)
28+
reporter := make(chan measureResult)
29+
f, err := os.OpenFile("result.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0755)
30+
if err != nil {
31+
log.Fatalf("can't open file: %s\n", err)
32+
}
33+
34+
measure := func(addr string) {
35+
defer sema.Release(1)
36+
37+
tcp, err := tool.TCPing(&tool.TCPingQ{
38+
Address: addr,
39+
Family: 0,
40+
Port: 443,
41+
Wait: 1000,
42+
Interval: 1000,
43+
Times: 4,
44+
})
45+
46+
if err != nil {
47+
log.Printf("failed tcping %s: %s\n", addr, err)
48+
}
49+
50+
result := measureResult{
51+
addr: addr,
52+
}
53+
for _, record := range tcp.Data {
54+
if record.Success {
55+
result.received++
56+
result.latency += record.Latency
57+
result.score += 1000 - record.Latency
58+
}
59+
}
60+
61+
if result.received == 0 {
62+
result.latency = 1000
63+
} else {
64+
result.latency /= float64(result.received)
65+
}
66+
67+
result.score /= 4000 / 100 // rescale from 4000 to 100
68+
reporter <- result
69+
}
70+
71+
go func() {
72+
for result := range reporter {
73+
log.Printf("%s score %.2f, %.2fms of %d success\n", result.addr, result.score, result.latency, result.received)
74+
_, err := fmt.Fprintf(f, "%s %f %f %d\n", result.addr, result.score, result.latency, result.received)
75+
if err != nil {
76+
log.Fatalf("Failed write record: %s\n", err)
77+
}
78+
}
79+
80+
_ = f.Close()
81+
}()
82+
83+
for i := 0; i < 0xff; i++ {
84+
addr := fmt.Sprintf("0.0.0.%d", i)
85+
if i%0x100 == 0 {
86+
log.Printf("Now at %s\n", addr)
87+
}
88+
_ = sema.Acquire(context.Background(), 1)
89+
go measure(addr)
90+
}
91+
92+
_ = sema.Acquire(context.Background(), concurrency)
93+
close(reporter)
94+
}

0 commit comments

Comments
 (0)