mirror of
https://github.com/unchainese/unchain.git
synced 2026-04-22 23:37:07 +08:00
feat: add default buffer size and implement read deadlines for VLESS and SOCKS5 connections
This commit is contained in:
@@ -114,6 +114,9 @@ func (c Config) ListenPort() int {
|
||||
}
|
||||
|
||||
func (c Config) GetBufferSize() int {
|
||||
if c.BufferSize == "" {
|
||||
return 8192
|
||||
}
|
||||
iv, err := strconv.ParseInt(c.BufferSize, 10, 32)
|
||||
if err != nil {
|
||||
log.Println("failed to parse buffer size:", err)
|
||||
|
||||
@@ -95,6 +95,8 @@ func (app *App) WsVLESS(w http.ResponseWriter, r *http.Request) {
|
||||
go app.trafficInc(vData.UUID(), sessionTrafficByteN)
|
||||
}
|
||||
|
||||
const readTimeOut = 10 * time.Second
|
||||
|
||||
func (app *App) vlessTCP(ctx context.Context, sv *schema.ProtoVLESS, ws *websocket.Conn) int64 {
|
||||
logger := sv.Logger()
|
||||
conn, headerVLESS, err := startDstConnection(sv, time.Millisecond*1000)
|
||||
@@ -127,6 +129,7 @@ func (app *App) vlessTCP(ctx context.Context, sv *schema.ProtoVLESS, ws *websock
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
ws.SetReadDeadline(time.Now().Add(readTimeOut))
|
||||
mt, message, err := ws.ReadMessage()
|
||||
trafficMeter.Add(int64(len(message)))
|
||||
if websocket.IsCloseError(err, websocket.CloseNormalClosure) {
|
||||
@@ -159,6 +162,7 @@ func (app *App) vlessTCP(ctx context.Context, sv *schema.ProtoVLESS, ws *websock
|
||||
case <-ctx.Done():
|
||||
return
|
||||
default:
|
||||
conn.SetReadDeadline(time.Now().Add(readTimeOut))
|
||||
n, err := conn.Read(buf)
|
||||
trafficMeter.Add(int64(n))
|
||||
if errors.Is(err, io.EOF) {
|
||||
|
||||
+16
-3
@@ -321,9 +321,10 @@ func handleTCPRelay(client net.Conn, request *socks5Request) error {
|
||||
}()
|
||||
|
||||
// Wait for either direction to finish
|
||||
err = <-errChan
|
||||
if err != nil && err != io.EOF {
|
||||
slog.Debug(fmt.Sprintf("TCP relay error: %v", err))
|
||||
for i := 0; i < 2; i++ {
|
||||
if err := <-errChan; err != nil && err != io.EOF {
|
||||
slog.Debug(fmt.Sprintf("TCP relay error: %v", err))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -370,6 +371,18 @@ func handleUDPRelay(client net.Conn, request *socks5Request) error {
|
||||
|
||||
slog.Info(fmt.Sprintf("UDP association established on %s for client %s", actualAddr.String(), client.RemoteAddr()))
|
||||
|
||||
// Monitor client connection and close UDP listener when client disconnects
|
||||
go func() {
|
||||
defer udpListener.Close()
|
||||
buf := make([]byte, 1)
|
||||
for {
|
||||
_, err := client.Read(buf)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
// Start UDP relay
|
||||
return handleUDPDataRelay(udpListener, client)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user