diff --git a/common/net/tcp_keepalive_go122.go b/common/net/tcp_keepalive_go122.go new file mode 100644 index 0000000000..099701578e --- /dev/null +++ b/common/net/tcp_keepalive_go122.go @@ -0,0 +1,12 @@ +//go:build !go1.23 + +package net + +import "net" + +func TCPKeepAlive(c net.Conn) { + if tcp, ok := c.(*net.TCPConn); ok { + _ = tcp.SetKeepAlive(true) + _ = tcp.SetKeepAlivePeriod(KeepAliveInterval) + } +} diff --git a/common/net/tcp_keepalive_go123.go b/common/net/tcp_keepalive_go123.go new file mode 100644 index 0000000000..f5bca964d2 --- /dev/null +++ b/common/net/tcp_keepalive_go123.go @@ -0,0 +1,15 @@ +//go:build go1.23 + +package net + +import "net" + +func TCPKeepAlive(c net.Conn) { + if tcp, ok := c.(*net.TCPConn); ok { + _ = tcp.SetKeepAliveConfig(net.KeepAliveConfig{ + Enable: true, + Idle: KeepAliveIdle, + Interval: KeepAliveInterval, + }) + } +} diff --git a/common/net/tcpip.go b/common/net/tcpip.go index 0499e54c17..4f4fa66118 100644 --- a/common/net/tcpip.go +++ b/common/net/tcpip.go @@ -7,7 +7,10 @@ import ( "time" ) -var KeepAliveInterval = 15 * time.Second +var ( + KeepAliveIdle = 0 * time.Second + KeepAliveInterval = 0 * time.Second +) func SplitNetworkType(s string) (string, string, error) { var ( @@ -47,10 +50,3 @@ func SplitHostPort(s string) (host, port string, hasPort bool, err error) { host, port, err = net.SplitHostPort(temp) return } - -func TCPKeepAlive(c net.Conn) { - if tcp, ok := c.(*net.TCPConn); ok { - _ = tcp.SetKeepAlive(true) - _ = tcp.SetKeepAlivePeriod(KeepAliveInterval) - } -} diff --git a/config/config.go b/config/config.go index 5f2b68453d..3b13146df4 100644 --- a/config/config.go +++ b/config/config.go @@ -338,6 +338,7 @@ type RawConfig struct { FindProcessMode P.FindProcessMode `yaml:"find-process-mode" json:"find-process-mode"` GlobalClientFingerprint string `yaml:"global-client-fingerprint"` GlobalUA string `yaml:"global-ua"` + KeepAliveIdle int `yaml:"keep-alive-idle"` KeepAliveInterval int `yaml:"keep-alive-interval"` Sniffer RawSniffer `yaml:"sniffer" json:"sniffer"` @@ -649,6 +650,10 @@ func parseGeneral(cfg *RawConfig) (*General, error) { C.ASNUrl = cfg.GeoXUrl.ASN C.GeodataMode = cfg.GeodataMode C.UA = cfg.GlobalUA + + if cfg.KeepAliveIdle != 0 { + N.KeepAliveIdle = time.Duration(cfg.KeepAliveIdle) * time.Second + } if cfg.KeepAliveInterval != 0 { N.KeepAliveInterval = time.Duration(cfg.KeepAliveInterval) * time.Second } diff --git a/docs/config.yaml b/docs/config.yaml index d7c686d01f..6feca27d81 100644 --- a/docs/config.yaml +++ b/docs/config.yaml @@ -82,7 +82,8 @@ external-doh-server: /dns-query global-client-fingerprint: chrome # TCP keep alive interval -keep-alive-interval: 15 +# keep-alive-idle: 7200 +# keep-alive-interval: 75 # routing-mark:6666 # 配置 fwmark 仅用于 Linux experimental: