mirror of https://github.com/cbeuw/Cloak
Implement TCP_NODELAY in client and server tcp connections.
This commit is contained in:
parent
4efd000bda
commit
455a7cdea0
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue