kcp-go
kcp-go copied to clipboard
我修改了echo.go, 去除代码sleep, 添加了带宽统计,本机单链接带宽只能到8m?
package main
import ( "crypto/sha1" "io" "log" "time"
"github.com/xtaci/kcp-go/v5"
"golang.org/x/crypto/pbkdf2"
)
func main() { key := pbkdf2.Key([]byte("demo pass"), []byte("demo salt"), 1024, 32, sha1.New) block, _ := kcp.NewAESBlockCrypt(key) if listener, err := kcp.ListenWithOptions("127.0.0.1:12345", block, 10, 3); err == nil { // spin-up the client // 启动一个客户端 go client() for { //接受客户端 s, err := listener.AcceptKCP() if err != nil { log.Fatal(err) } //服务端发送数据 go handleEcho(s) } } else { log.Fatal(err) } }
// handleEcho send back everything it received func handleEcho(conn *kcp.UDPSession) { //接受数据原样放回 buf := make([]byte, 4096) for { n, err := conn.Read(buf) if err != nil { log.Println(err) return }
n, err = conn.Write(buf[:n])
if err != nil {
log.Println(err)
return
}
}
}
func client() { key := pbkdf2.Key([]byte("demo pass"), []byte("demo salt"), 1024, 32, sha1.New) block, _ := kcp.NewAESBlockCrypt(key)
// wait for server to become ready
time.Sleep(time.Second)
start := time.Now()
var read_bytes int64 = 0
var elapsed int64 = 0.0
// dial to the echo server
if sess, err := kcp.DialWithOptions("127.0.0.1:12345", block, 10, 3); err == nil {
buf := make([]byte, 4096)
for {
if _, err := sess.Write(buf[:]); err == nil {
// read back the data
if n, err := io.ReadFull(sess, buf); err == nil {
//统计接受字节
read_bytes += int64(n)
//总共用了多少秒
curr_elapsed := int64(time.Since(start).Seconds())
//时间发生变化
if curr_elapsed > elapsed {
elapsed = curr_elapsed
//接受了多少m
total := float64(read_bytes) / (1024 * 1024)
//统计每秒多少流量m
avg := total / float64(elapsed)
log.Printf("total = %vm, elapsed = %v, avg = %vm\n", total, elapsed, avg)
}
//log.Printf("recv n: %v\n", n)
} else {
log.Fatal(err)
return
}
} else {
log.Fatal(err)
return
}
}
} else {
log.Fatal(err)
return
}
}
测试结果 yfy@DESKTOP-6FFO6TL MINGW64 ~/Desktop/kcp $ go run echo.go 2021/09/23 10:51:33 total = 7.9765625m, elapsed = 1, avg = 7.9765625m 2021/09/23 10:51:34 total = 16.734375m, elapsed = 2, avg = 8.3671875m 2021/09/23 10:51:35 total = 25.875m, elapsed = 3, avg = 8.625m 2021/09/23 10:51:36 total = 35.046875m, elapsed = 4, avg = 8.76171875m 2021/09/23 10:51:37 total = 44.125m, elapsed = 5, avg = 8.825m 2021/09/23 10:51:38 total = 53.08984375m, elapsed = 6, avg = 8.848307291666666m 2021/09/23 10:51:39 total = 62.1015625m, elapsed = 7, avg = 8.871651785714286m 2021/09/23 10:51:40 total = 71.08203125m, elapsed = 8, avg = 8.88525390625m 2021/09/23 10:51:41 total = 79.71875m, elapsed = 9, avg = 8.85763888888889m 2021/09/23 10:51:42 total = 88.4921875m, elapsed = 10, avg = 8.84921875m 2021/09/23 10:51:43 total = 97.171875m, elapsed = 11, avg = 8.833806818181818m 2021/09/23 10:51:44 total = 105.92578125m, elapsed = 12, avg = 8.8271484375m 2021/09/23 10:51:45 total = 114.578125m, elapsed = 13, avg = 8.813701923076923m 2021/09/23 10:51:46 total = 123.16796875m, elapsed = 14, avg = 8.797712053571429m
开发环境:window10 64位, linux 都只能跑到8m, 我用udp可以跑到400m, 是我的例子没写好吗? 还是我系统环境有问题?
写法参考benchmark
能不能写个快的实例代码,按echo.go 写出来的,真不快,本机测试只有320KB 这速度。。。