mirror of https://github.com/v2ray/v2ray-core
close timer faster
parent
aea71c2aa8
commit
5829b45bbe
|
@ -141,11 +141,14 @@ func (h *DynamicInboundHandler) refresh() error {
|
|||
}
|
||||
|
||||
func (h *DynamicInboundHandler) monitor() {
|
||||
timer := time.NewTicker(time.Minute * time.Duration(h.receiverConfig.AllocationStrategy.GetRefreshValue()))
|
||||
defer timer.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-h.ctx.Done():
|
||||
return
|
||||
case <-time.After(time.Minute * time.Duration(h.receiverConfig.AllocationStrategy.GetRefreshValue())):
|
||||
case <-timer.C:
|
||||
h.refresh()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -278,11 +278,14 @@ func (w *udpWorker) Close() {
|
|||
}
|
||||
|
||||
func (w *udpWorker) monitor() {
|
||||
timer := time.NewTicker(time.Second * 16)
|
||||
defer timer.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-w.ctx.Done():
|
||||
return
|
||||
case <-time.After(time.Second * 16):
|
||||
case <-timer.C:
|
||||
nowSec := time.Now().Unix()
|
||||
w.Lock()
|
||||
for addr, conn := range w.activeConn {
|
||||
|
|
|
@ -115,6 +115,9 @@ func (m *Client) Closed() bool {
|
|||
func (m *Client) monitor() {
|
||||
defer m.manager.onClientFinish()
|
||||
|
||||
timer := time.NewTicker(time.Second * 16)
|
||||
defer timer.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-m.ctx.Done():
|
||||
|
@ -122,7 +125,7 @@ func (m *Client) monitor() {
|
|||
m.inboundRay.InboundInput().Close()
|
||||
m.inboundRay.InboundOutput().CloseError()
|
||||
return
|
||||
case <-time.After(time.Second * 16):
|
||||
case <-timer.C:
|
||||
size := m.sessionManager.Size()
|
||||
if size == 0 && m.sessionManager.CloseIfNoSession() {
|
||||
m.cancel()
|
||||
|
|
|
@ -35,7 +35,7 @@ func (r *retryer) On(method func() error) error {
|
|||
accumulatedError = append(accumulatedError, err)
|
||||
}
|
||||
delay := r.nextDelay()
|
||||
<-time.After(time.Duration(delay) * time.Millisecond)
|
||||
time.Sleep(time.Duration(delay) * time.Millisecond)
|
||||
attempt++
|
||||
}
|
||||
return newError(accumulatedError).Base(ErrRetryFailed)
|
||||
|
|
|
@ -100,7 +100,7 @@ func (*Server) handleUDP() error {
|
|||
// The TCP connection closes after v method returns. We need to wait until
|
||||
// the client closes it.
|
||||
// TODO: get notified from UDP part
|
||||
<-time.After(5 * time.Minute)
|
||||
time.Sleep(5 * time.Minute)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ func TestBuildAndRun(t *testing.T) {
|
|||
cmd.Stderr = errBuffer
|
||||
cmd.Start()
|
||||
|
||||
<-time.After(1 * time.Second)
|
||||
time.Sleep(1 * time.Second)
|
||||
cmd.Process.Kill()
|
||||
|
||||
outStr := string(outBuffer.Bytes())
|
||||
|
|
|
@ -18,30 +18,26 @@ import (
|
|||
func TestDialAndListen(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
|
||||
conns := make(chan internet.Connection, 16)
|
||||
listerner, err := NewListener(internet.ContextWithTransportSettings(context.Background(), &Config{}), v2net.LocalHostIP, v2net.Port(0), conns)
|
||||
listerner, err := NewListener(internet.ContextWithTransportSettings(context.Background(), &Config{}), v2net.LocalHostIP, v2net.Port(0), func(ctx context.Context, conn internet.Connection) bool {
|
||||
go func(c internet.Connection) {
|
||||
payload := make([]byte, 4096)
|
||||
for {
|
||||
nBytes, err := c.Read(payload)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
for idx, b := range payload[:nBytes] {
|
||||
payload[idx] = b ^ 'c'
|
||||
}
|
||||
c.Write(payload[:nBytes])
|
||||
}
|
||||
c.Close()
|
||||
}(conn)
|
||||
return true
|
||||
})
|
||||
assert.Error(err).IsNil()
|
||||
port := v2net.Port(listerner.Addr().(*net.UDPAddr).Port)
|
||||
|
||||
go func() {
|
||||
for conn := range conns {
|
||||
go func(c internet.Connection) {
|
||||
payload := make([]byte, 4096)
|
||||
for {
|
||||
nBytes, err := c.Read(payload)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
for idx, b := range payload[:nBytes] {
|
||||
payload[idx] = b ^ 'c'
|
||||
}
|
||||
c.Write(payload[:nBytes])
|
||||
}
|
||||
c.Close()
|
||||
}(conn)
|
||||
}
|
||||
}()
|
||||
|
||||
ctx := internet.ContextWithTransportSettings(context.Background(), &Config{})
|
||||
wg := new(sync.WaitGroup)
|
||||
for i := 0; i < 10; i++ {
|
||||
|
@ -76,5 +72,4 @@ func TestDialAndListen(t *testing.T) {
|
|||
assert.Int(listerner.ActiveConnections()).Equals(0)
|
||||
|
||||
listerner.Close()
|
||||
close(conns)
|
||||
}
|
||||
|
|
|
@ -81,10 +81,10 @@ type Listener struct {
|
|||
reader PacketReader
|
||||
header internet.PacketHeader
|
||||
security cipher.AEAD
|
||||
conns chan<- internet.Connection
|
||||
addConn internet.AddConnection
|
||||
}
|
||||
|
||||
func NewListener(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (*Listener, error) {
|
||||
func NewListener(ctx context.Context, address v2net.Address, port v2net.Port, addConn internet.AddConnection) (*Listener, error) {
|
||||
networkSettings := internet.TransportSettingsFromContext(ctx)
|
||||
kcpSettings := networkSettings.(*Config)
|
||||
|
||||
|
@ -106,7 +106,7 @@ func NewListener(ctx context.Context, address v2net.Address, port v2net.Port, co
|
|||
sessions: make(map[ConnectionID]*Connection),
|
||||
ctx: ctx,
|
||||
config: kcpSettings,
|
||||
conns: conns,
|
||||
addConn: addConn,
|
||||
}
|
||||
securitySettings := internet.SecuritySettingsFromContext(ctx)
|
||||
if securitySettings != nil {
|
||||
|
@ -190,10 +190,7 @@ func (v *Listener) OnReceive(payload *buf.Buffer, src v2net.Destination, origina
|
|||
netConn = tlsConn
|
||||
}
|
||||
|
||||
select {
|
||||
case v.conns <- netConn:
|
||||
case <-time.After(time.Second * 5):
|
||||
conn.Close()
|
||||
if !v.addConn(context.Background(), netConn) {
|
||||
return
|
||||
}
|
||||
v.sessions[id] = conn
|
||||
|
@ -254,8 +251,8 @@ func (v *Writer) Close() error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func ListenKCP(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (internet.Listener, error) {
|
||||
return NewListener(ctx, address, port, conns)
|
||||
func ListenKCP(ctx context.Context, address v2net.Address, port v2net.Port, addConn internet.AddConnection) (internet.Listener, error) {
|
||||
return NewListener(ctx, address, port, addConn)
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
|
|
@ -4,7 +4,6 @@ import (
|
|||
"context"
|
||||
gotls "crypto/tls"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"v2ray.com/core/app/log"
|
||||
"v2ray.com/core/common"
|
||||
|
@ -20,10 +19,10 @@ type TCPListener struct {
|
|||
tlsConfig *gotls.Config
|
||||
authConfig internet.ConnectionAuthenticator
|
||||
config *Config
|
||||
conns chan<- internet.Connection
|
||||
addConn internet.AddConnection
|
||||
}
|
||||
|
||||
func ListenTCP(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (internet.Listener, error) {
|
||||
func ListenTCP(ctx context.Context, address v2net.Address, port v2net.Port, addConn internet.AddConnection) (internet.Listener, error) {
|
||||
listener, err := net.ListenTCP("tcp", &net.TCPAddr{
|
||||
IP: address.IP(),
|
||||
Port: int(port),
|
||||
|
@ -39,7 +38,7 @@ func ListenTCP(ctx context.Context, address v2net.Address, port v2net.Port, conn
|
|||
ctx: ctx,
|
||||
listener: listener,
|
||||
config: tcpSettings,
|
||||
conns: conns,
|
||||
addConn: addConn,
|
||||
}
|
||||
if securitySettings := internet.SecuritySettingsFromContext(ctx); securitySettings != nil {
|
||||
tlsConfig, ok := securitySettings.(*tls.Config)
|
||||
|
@ -90,11 +89,7 @@ func (v *TCPListener) KeepAccepting() {
|
|||
conn = v.authConfig.Server(conn)
|
||||
}
|
||||
|
||||
select {
|
||||
case v.conns <- internet.Connection(conn):
|
||||
case <-time.After(time.Second * 5):
|
||||
conn.Close()
|
||||
}
|
||||
v.addConn(context.Background(), internet.Connection(conn))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ package internet
|
|||
import (
|
||||
"context"
|
||||
"net"
|
||||
"time"
|
||||
|
||||
v2net "v2ray.com/core/common/net"
|
||||
)
|
||||
|
@ -19,7 +20,9 @@ func RegisterTransportListener(protocol TransportProtocol, listener ListenFunc)
|
|||
return nil
|
||||
}
|
||||
|
||||
type ListenFunc func(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- Connection) (Listener, error)
|
||||
type AddConnection func(context.Context, Connection) bool
|
||||
|
||||
type ListenFunc func(ctx context.Context, address v2net.Address, port v2net.Port, addConn AddConnection) (Listener, error)
|
||||
|
||||
type Listener interface {
|
||||
Close() error
|
||||
|
@ -45,7 +48,26 @@ func ListenTCP(ctx context.Context, address v2net.Address, port v2net.Port, conn
|
|||
if listenFunc == nil {
|
||||
return nil, newError(protocol, " listener not registered.").AtError()
|
||||
}
|
||||
listener, err := listenFunc(ctx, address, port, conns)
|
||||
listener, err := listenFunc(ctx, address, port, func(ctx context.Context, conn Connection) bool {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
conn.Close()
|
||||
return false
|
||||
case conns <- conn:
|
||||
return true
|
||||
default:
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
conn.Close()
|
||||
return false
|
||||
case conns <- conn:
|
||||
return true
|
||||
case <-time.After(time.Second * 5):
|
||||
conn.Close()
|
||||
return false
|
||||
}
|
||||
}
|
||||
})
|
||||
if err != nil {
|
||||
return nil, newError("failed to listen on address: ", address, ":", port).Base(err)
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import (
|
|||
"net/http"
|
||||
"strconv"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
"v2ray.com/core/app/log"
|
||||
|
@ -33,13 +32,7 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
|
|||
return
|
||||
}
|
||||
|
||||
select {
|
||||
case <-h.ln.ctx.Done():
|
||||
conn.Close()
|
||||
case h.ln.conns <- internet.Connection(conn):
|
||||
case <-time.After(time.Second * 5):
|
||||
conn.Close()
|
||||
}
|
||||
h.ln.addConn(h.ln.ctx, internet.Connection(conn))
|
||||
}
|
||||
|
||||
type Listener struct {
|
||||
|
@ -48,17 +41,17 @@ type Listener struct {
|
|||
listener net.Listener
|
||||
tlsConfig *tls.Config
|
||||
config *Config
|
||||
conns chan<- internet.Connection
|
||||
addConn internet.AddConnection
|
||||
}
|
||||
|
||||
func ListenWS(ctx context.Context, address v2net.Address, port v2net.Port, conns chan<- internet.Connection) (internet.Listener, error) {
|
||||
func ListenWS(ctx context.Context, address v2net.Address, port v2net.Port, addConn internet.AddConnection) (internet.Listener, error) {
|
||||
networkSettings := internet.TransportSettingsFromContext(ctx)
|
||||
wsSettings := networkSettings.(*Config)
|
||||
|
||||
l := &Listener{
|
||||
ctx: ctx,
|
||||
config: wsSettings,
|
||||
conns: conns,
|
||||
ctx: ctx,
|
||||
config: wsSettings,
|
||||
addConn: addConn,
|
||||
}
|
||||
if securitySettings := internet.SecuritySettingsFromContext(ctx); securitySettings != nil {
|
||||
tlsConfig, ok := securitySettings.(*v2tls.Config)
|
||||
|
|
|
@ -16,29 +16,26 @@ import (
|
|||
|
||||
func Test_listenWSAndDial(t *testing.T) {
|
||||
assert := assert.On(t)
|
||||
conns := make(chan internet.Connection, 16)
|
||||
listen, err := ListenWS(internet.ContextWithTransportSettings(context.Background(), &Config{
|
||||
Path: "ws",
|
||||
}), v2net.DomainAddress("localhost"), 13146, conns)
|
||||
}), v2net.DomainAddress("localhost"), 13146, func(ctx context.Context, conn internet.Connection) bool {
|
||||
go func(c internet.Connection) {
|
||||
defer c.Close()
|
||||
|
||||
var b [1024]byte
|
||||
n, err := c.Read(b[:])
|
||||
//assert.Error(err).IsNil()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
assert.Bool(bytes.HasPrefix(b[:n], []byte("Test connection"))).IsTrue()
|
||||
|
||||
_, err = c.Write([]byte("Response"))
|
||||
assert.Error(err).IsNil()
|
||||
}(conn)
|
||||
return true
|
||||
})
|
||||
assert.Error(err).IsNil()
|
||||
go func() {
|
||||
for conn := range conns {
|
||||
go func(c internet.Connection) {
|
||||
defer c.Close()
|
||||
|
||||
var b [1024]byte
|
||||
n, err := c.Read(b[:])
|
||||
//assert.Error(err).IsNil()
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
assert.Bool(bytes.HasPrefix(b[:n], []byte("Test connection"))).IsTrue()
|
||||
|
||||
_, err = c.Write([]byte("Response"))
|
||||
assert.Error(err).IsNil()
|
||||
}(conn)
|
||||
}
|
||||
}()
|
||||
|
||||
ctx := internet.ContextWithTransportSettings(context.Background(), &Config{Path: "ws"})
|
||||
conn, err := Dial(ctx, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13146))
|
||||
|
@ -73,8 +70,6 @@ func Test_listenWSAndDial(t *testing.T) {
|
|||
assert.Error(conn.Close()).IsNil()
|
||||
|
||||
assert.Error(listen.Close()).IsNil()
|
||||
|
||||
close(conns)
|
||||
}
|
||||
|
||||
func Test_listenWSAndDial_TLS(t *testing.T) {
|
||||
|
@ -91,14 +86,14 @@ func Test_listenWSAndDial_TLS(t *testing.T) {
|
|||
AllowInsecure: true,
|
||||
Certificate: []*v2tls.Certificate{tlsgen.GenerateCertificateForTest()},
|
||||
})
|
||||
conns := make(chan internet.Connection, 16)
|
||||
listen, err := ListenWS(ctx, v2net.DomainAddress("localhost"), 13143, conns)
|
||||
listen, err := ListenWS(ctx, v2net.DomainAddress("localhost"), 13143, func(ctx context.Context, conn internet.Connection) bool {
|
||||
go func() {
|
||||
conn.Close()
|
||||
}()
|
||||
return true
|
||||
})
|
||||
assert.Error(err).IsNil()
|
||||
go func() {
|
||||
conn := <-conns
|
||||
conn.Close()
|
||||
listen.Close()
|
||||
}()
|
||||
defer listen.Close()
|
||||
|
||||
conn, err := Dial(ctx, v2net.TCPDestination(v2net.DomainAddress("localhost"), 13143))
|
||||
assert.Error(err).IsNil()
|
||||
|
|
Loading…
Reference in New Issue