Implement TCP_NODELAY in client and server tcp connections.

This commit is contained in:
notsure2 2023-06-10 15:46:51 +03:00
parent 4efd000bda
commit 455a7cdea0
3 changed files with 41 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import (
"net" "net"
"sync" "sync"
"sync/atomic" "sync/atomic"
"syscall"
"time" "time"
"github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/common"
@ -31,6 +32,22 @@ func MakeSession(connConfig RemoteConnConfig, authInfo AuthInfo, dialer common.D
goto makeconn goto makeconn
} }
tcpConn := remoteConn.(*net.TCPConn)
syscallConn, err := tcpConn.SyscallConn()
if err != nil {
panic(err)
}
err = syscallConn.Control(func(fd uintptr) {
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
if err != nil {
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
}
})
if err != nil {
panic(err)
}
transportConn := connConfig.TransportMaker() transportConn := connConfig.TransportMaker()
sk, err := transportConn.Handshake(remoteConn, authInfo) sk, err := transportConn.Handshake(remoteConn, authInfo)
if err != nil { if err != nil {

View File

@ -129,6 +129,11 @@ func RouteTCP(listener net.Listener, streamTimeout time.Duration, singleplex boo
log.Errorf("setsocketopt SO_RCVBUF: %s\n", err) log.Errorf("setsocketopt SO_RCVBUF: %s\n", err)
} }
} }
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
if err != nil {
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
}
}) })
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)

View File

@ -9,6 +9,7 @@ import (
"io" "io"
"net" "net"
"net/http" "net/http"
"syscall"
"time" "time"
"github.com/cbeuw/Cloak/internal/common" "github.com/cbeuw/Cloak/internal/common"
@ -294,6 +295,24 @@ func serveSession(sesh *mux.Session, ci ClientInfo, user *ActiveUser, sta *State
} }
log.Tracef("%v endpoint has been successfully connected", ci.ProxyMethod) log.Tracef("%v endpoint has been successfully connected", ci.ProxyMethod)
tcpConn, ok := localConn.(*net.TCPConn)
if ok {
syscallConn, err := tcpConn.SyscallConn()
if err != nil {
return err
}
err = syscallConn.Control(func(fd uintptr) {
err = syscall.SetsockoptInt(common.Platformfd(fd), syscall.IPPROTO_TCP, syscall.TCP_NODELAY, 1)
if err != nil {
log.Errorf("setsocketopt TCP_NODELAY: %s\n", err)
}
})
if err != nil {
return err
}
}
go func() { go func() {
if _, err := common.Copy(localConn, newStream); err != nil { if _, err := common.Copy(localConn, newStream); err != nil {
log.Tracef("copying stream to proxy server: %v", err) log.Tracef("copying stream to proxy server: %v", err)