Skip to content

Commit aac5caf

Browse files
author
sg
committed
* add UDP RTT
1 parent 78585ba commit aac5caf

4 files changed

Lines changed: 82 additions & 3 deletions

File tree

client/auto.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package client
22

33
import (
44
"bufio"
5+
"context"
56
"fmt"
67
"log"
78
"os"
@@ -62,6 +63,25 @@ func RunAutoMode() {
6263
func runAutoTests(target, transferType string, blocksize uint32) {
6364
const conns = 3
6465

66+
ctx, cancel := context.WithCancel(context.Background())
67+
defer cancel()
68+
go func() {
69+
ticker := time.NewTicker(time.Second)
70+
defer ticker.Stop()
71+
for {
72+
select {
73+
case <-ctx.Done():
74+
return
75+
case <-ticker.C:
76+
if ms, ok := UDPLatencyProbe(target); ok {
77+
fmt.Printf(" [UDP RTT] %s\n", formatUDPLatency(ms))
78+
} else {
79+
fmt.Printf(" [UDP RTT] ---\n")
80+
}
81+
}
82+
}
83+
}()
84+
6585
fmt.Println("Test 1: Download 10s (3 connections)...")
6686
deadline1 := time.Now().Add(AutoTestDuration)
6787
var wg sync.WaitGroup

client/client.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"errors"
55
"fmt"
66
"log"
7+
"net"
78
"sync"
89
"sync/atomic"
910
"time"
@@ -53,6 +54,32 @@ func bytes2human(n int64, base int64) (str string) {
5354
return fmt.Sprintf("%8.2f B", float64(n))
5455
}
5556

57+
func UDPLatencyProbe(serverAddr string) (ms float64, ok bool) {
58+
conn, err := net.DialTimeout("udp", serverAddr, 5*time.Second)
59+
if err != nil {
60+
return 0, false
61+
}
62+
defer conn.Close()
63+
payload := []byte("ping")
64+
start := time.Now()
65+
if _, err := conn.Write(payload); err != nil {
66+
return 0, false
67+
}
68+
buf := make([]byte, 64)
69+
conn.SetReadDeadline(time.Now().Add(5 * time.Second))
70+
if _, err := conn.Read(buf); err != nil {
71+
return 0, false
72+
}
73+
return float64(time.Since(start).Nanoseconds()) / 1e6, true
74+
}
75+
76+
func formatUDPLatency(ms float64) string {
77+
if ms < 0.001 {
78+
return "< 0.001 ms"
79+
}
80+
return fmt.Sprintf("%.3f ms", ms)
81+
}
82+
5683
func connectServer(serverAddr string, localAddr string, transferType string) (transfer.Conn, error) {
5784
var l transfer.Conn
5885
var err error
@@ -152,7 +179,7 @@ exit:
152179
wg.Done()
153180
}
154181

155-
func DispalySpeed() {
182+
func DispalySpeed(serverAddr string) {
156183
var last_up int64 = 0
157184
var last_down int64 = 0
158185

@@ -173,7 +200,13 @@ func DispalySpeed() {
173200
}
174201
now_up := atomic.LoadInt64(&total_write)
175202
now_down := atomic.LoadInt64(&total_read)
176-
log.Printf("down:%s/s up:%s/s ...", bytes2human(now_down-last_down, 1000), bytes2human(now_up-last_up, 1000))
203+
latencyStr := "---"
204+
if serverAddr != "" {
205+
if ms, ok := UDPLatencyProbe(serverAddr); ok {
206+
latencyStr = formatUDPLatency(ms)
207+
}
208+
}
209+
log.Printf("down:%s/s up:%s/s udp_rtt:%s", bytes2human(now_down-last_down, 1000), bytes2human(now_up-last_up, 1000), latencyStr)
177210
last_up = now_up
178211
last_down = now_down
179212
}

netspeed.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func main() {
7171

7272
}
7373
if *onlyConnect != true {
74-
go client.DispalySpeed()
74+
go client.DispalySpeed(*caddress)
7575
}
7676

7777
} else if *saddress != "" {

server/server.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,31 @@ func parsePortFromAddress(address string) string {
8080
return port
8181
}
8282

83+
func ServeUDPEcho(port string) {
84+
portNum, err := strconv.Atoi(port)
85+
if err != nil || portNum <= 0 {
86+
return
87+
}
88+
addr := &net.UDPAddr{IP: net.IPv4zero, Port: portNum}
89+
conn, err := net.ListenUDP("udp4", addr)
90+
if err != nil {
91+
log.Printf("udp echo listen error: %v", err)
92+
return
93+
}
94+
defer conn.Close()
95+
log.Printf("udp echo listening on :%s (same port as TCP)", port)
96+
buf := make([]byte, 256)
97+
for {
98+
n, remote, err := conn.ReadFromUDP(buf)
99+
if err != nil {
100+
return
101+
}
102+
if n > 0 {
103+
_, _ = conn.WriteToUDP(buf[:n], remote)
104+
}
105+
}
106+
}
107+
83108
func ServerMain(address string, transferType string, wg *sync.WaitGroup) {
84109
var l transfer.Listener
85110
var err error
@@ -103,6 +128,7 @@ func ServerMain(address string, transferType string, wg *sync.WaitGroup) {
103128
servicePort := parsePortFromAddress(address)
104129
if servicePort != "" {
105130
go ServeDiscovery(DiscoveryPort, servicePort)
131+
go ServeUDPEcho(servicePort)
106132
}
107133
log.Printf("listen:%s %s", address, transferType)
108134
for {

0 commit comments

Comments
 (0)