重构连接监听与处理代码逻辑,连接信息存储于全局通过接口展示

This commit is contained in:
2025-05-19 09:41:41 +08:00
parent aa967fbd6a
commit 24351e1c56
8 changed files with 126 additions and 67 deletions

View File

@@ -2,22 +2,24 @@ package fwd
import (
"bufio"
"context"
"errors"
"fmt"
"github.com/google/uuid"
"io"
"log/slog"
"net"
"proxy-server/gateway/app"
"proxy-server/gateway/debug"
"proxy-server/gateway/env"
"proxy-server/gateway/fwd/metrics"
utils2 "proxy-server/utils"
"proxy-server/utils"
"strconv"
"sync"
"time"
)
func (s *Service) listenData() error {
func ListenData(ctx context.Context) error {
dataPort := env.AppDataPort
// 监听端口
@@ -25,7 +27,7 @@ func (s *Service) listenData() error {
if err != nil {
return fmt.Errorf("监听数据通道失败: %w", err)
}
defer utils2.Close(ls)
defer utils.Close(ls)
// 异步等待连接
var connCh = make(chan net.Conn)
@@ -42,8 +44,8 @@ func (s *Service) listenData() error {
}
select {
case connCh <- conn:
case <-s.ctx.Done():
utils2.Close(conn)
case <-ctx.Done():
utils.Close(conn)
return
}
}
@@ -52,14 +54,14 @@ func (s *Service) listenData() error {
// 处理连接
for {
select {
case <-s.ctx.Done():
case <-ctx.Done():
return nil
case conn := <-connCh:
s.dataConnWg.Add(1)
app.DataConnWg.Add(1)
go func() {
defer s.dataConnWg.Done()
defer utils2.Close(conn)
err := s.processDataConn(conn)
defer app.DataConnWg.Done()
defer utils.Close(conn)
err := processDataConn(ctx, conn)
if err != nil {
slog.Error("处理数据通道连接失败", "err", err)
}
@@ -68,7 +70,7 @@ func (s *Service) listenData() error {
}
}
func (s *Service) processDataConn(client net.Conn) error {
func processDataConn(ctx context.Context, client net.Conn) error {
var reader = bufio.NewReader(client)
// 接收连接结果
@@ -83,11 +85,11 @@ func (s *Service) processDataConn(client net.Conn) error {
// 加载用户连接
var tagStr = uuid.UUID(tag).String()
user, ok := s.userConnMap.LoadAndDelete(tagStr)
user, ok := app.UserConnMap.LoadAndDelete(tagStr)
if !ok {
return fmt.Errorf("用户连接已关闭tag%s", tagStr)
}
defer utils2.Close(user)
defer utils.Close(user)
// 检查状态
if status != 1 {
@@ -98,7 +100,7 @@ func (s *Service) processDataConn(client net.Conn) error {
data := time.Now()
userPipeReader, userPipeWriter := io.Pipe()
defer utils2.Close(userPipeWriter)
defer utils.Close(userPipeWriter)
teeUser := io.TeeReader(user, userPipeWriter)
go func() {
@@ -127,10 +129,10 @@ func (s *Service) processDataConn(client net.Conn) error {
select {
case <-s.ctx.Done():
case <-ctx.Done():
return nil
case <-utils2.WgWait(&wg):
case <-utils.WgWait(&wg):
proxy := time.Now()
start, startOk := metrics.TimerStart.Load(user.Conn)