From ea4d1d7d4ed8743896f2b9f16a8a131f56452f08 Mon Sep 17 00:00:00 2001 From: Lonny Wong Date: Sun, 23 Jun 2024 23:13:22 +0800 Subject: [PATCH] kcp no delay --- tsshd/proto.go | 39 +++++++++++++++++++++++++++++++++++++++ tsshd/service.go | 2 ++ 2 files changed, 41 insertions(+) diff --git a/tsshd/proto.go b/tsshd/proto.go index 11a75b1..dacc434 100644 --- a/tsshd/proto.go +++ b/tsshd/proto.go @@ -182,3 +182,42 @@ func RecvError(session *kcp.UDPSession) error { } return nil } + +func NewKcpSession(addr string, key []byte, cmd string) (session *kcp.UDPSession, err error) { + block, err := kcp.NewAESBlockCrypt(key) + if err != nil { + return nil, fmt.Errorf("new aes block crypt failed: %v", err) + } + + done := make(chan struct{}, 1) + go func() { + defer func() { + if err != nil && session != nil { + session.Close() + } + done <- struct{}{} + close(done) + }() + session, err = kcp.DialWithOptions(addr, block, 10, 3) + if err != nil { + err = fmt.Errorf("kcp dial [%s] [%s] failed: %v", addr, cmd, err) + return + } + session.SetNoDelay(1, 10, 2, 1) + if err = SendCommand(session, cmd); err != nil { + err = fmt.Errorf("kcp send command [%s] [%s] failed: %v", addr, cmd, err) + return + } + if err = RecvError(session); err != nil { + err = fmt.Errorf("kcp new session [%s] [%s] failed: %v", addr, cmd, err) + return + } + }() + + select { + case <-time.After(10 * time.Second): + err = fmt.Errorf("kcp new session [%s] [%s] timeout", addr, cmd) + case <-done: + } + return +} diff --git a/tsshd/service.go b/tsshd/service.go index 805c7dc..555a7e7 100644 --- a/tsshd/service.go +++ b/tsshd/service.go @@ -64,6 +64,8 @@ func serve(listener *kcp.Listener) { func handleSession(session *kcp.UDPSession) { defer session.Close() + session.SetNoDelay(1, 10, 2, 1) + command, err := RecvCommand(session) if err != nil { SendError(session, fmt.Errorf("recv session command failed: %v", err))