feat: add default buffer size and implement read deadlines for VLESS and SOCKS5 connections

This commit is contained in:
Eric Zhou
2025-09-02 10:34:24 +08:00
parent b025d6f54b
commit c29757f547
3 changed files with 23 additions and 3 deletions
+3
View File
@@ -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)
+4
View File
@@ -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
View File
@@ -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)
}