重构连接监听与处理代码逻辑,连接信息存储于全局通过接口展示
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log/slog"
|
||||
"proxy-server/gateway/app"
|
||||
"proxy-server/gateway/core"
|
||||
"proxy-server/gateway/env"
|
||||
"proxy-server/gateway/fwd/dispatcher"
|
||||
@@ -15,7 +16,7 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func (s *Service) listenUser(ctx context.Context, port uint16, ctrl io.Writer) error {
|
||||
func ListenUser(ctx context.Context, port uint16, ctrl io.Writer) error {
|
||||
dspt, err := dispatcher.New(port, time.Duration(env.AppUserTimeout)*time.Second)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -44,10 +45,10 @@ func (s *Service) listenUser(ctx context.Context, port uint16, ctrl io.Writer) e
|
||||
return err
|
||||
case user := <-dspt.Conn:
|
||||
metrics.TimerAuth.Store(user.Conn, time.Now())
|
||||
s.userConnWg.Add(1)
|
||||
app.UserConnWg.Add(1)
|
||||
go func() {
|
||||
defer s.userConnWg.Done()
|
||||
err := s.processUserConn(user, ctrl)
|
||||
defer app.UserConnWg.Done()
|
||||
err := processUserConn(ctx, user, ctrl)
|
||||
if err != nil {
|
||||
slog.Error("处理用户连接失败", "err", err)
|
||||
utils.Close(user)
|
||||
@@ -57,16 +58,16 @@ func (s *Service) listenUser(ctx context.Context, port uint16, ctrl io.Writer) e
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) processUserConn(user *core.Conn, ctrl io.Writer) (err error) {
|
||||
func processUserConn(ctx context.Context, user *core.Conn, ctrl io.Writer) (err error) {
|
||||
|
||||
// 发送代理命令
|
||||
err = s.sendProxy(ctrl, user.Tag, user.Dest.String())
|
||||
err = sendProxy(ctrl, user.Tag, user.Dest.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 保存用户连接
|
||||
s.userConnMap.Store(hex.EncodeToString(user.Tag[:]), user)
|
||||
app.UserConnMap.Store(hex.EncodeToString(user.Tag[:]), user)
|
||||
|
||||
// 如果限定时间内没有建立数据通道,则关闭连接
|
||||
var timeout, cancel = context.WithTimeout(context.Background(), time.Duration(env.AppDataTimeout)*time.Second)
|
||||
@@ -75,11 +76,11 @@ func (s *Service) processUserConn(user *core.Conn, ctrl io.Writer) (err error) {
|
||||
select {
|
||||
case <-timeout.Done():
|
||||
err = timeout.Err()
|
||||
case <-s.ctx.Done():
|
||||
err = s.ctx.Err()
|
||||
case <-ctx.Done():
|
||||
err = ctx.Err()
|
||||
}
|
||||
|
||||
_, ok := s.userConnMap.LoadAndDelete(hex.EncodeToString(user.Tag[:]))
|
||||
_, ok := app.UserConnMap.LoadAndDelete(hex.EncodeToString(user.Tag[:]))
|
||||
if ok {
|
||||
utils.Close(user)
|
||||
if errors.Is(err, context.DeadlineExceeded) {
|
||||
|
||||
Reference in New Issue
Block a user