优化节点连接管理逻辑与日志输出,修改连接错误处理函数的返回值以确保错误处理灵活性

This commit is contained in:
2025-05-29 14:44:06 +08:00
parent 1831c792ad
commit ceb381bc9b
9 changed files with 57 additions and 48 deletions

View File

@@ -4,6 +4,7 @@ import (
"bufio"
"context"
"encoding/binary"
"encoding/hex"
"errors"
"fmt"
"io"
@@ -99,7 +100,7 @@ func ctrl(ctx context.Context, id int32, host string) error {
for {
// 读取命令
cmd, err := reader.ReadByte()
if ok, err := utils.WarpConnErr(err); !ok {
if _, err := utils.WarpConnErr(err); err != nil {
errCh <- err
return
}
@@ -136,24 +137,23 @@ func ctrl(ctx context.Context, id int32, host string) error {
}
func data(proxy string, destination string, tag [16]byte) error {
slog.Debug("建立数据通道", "tag", tag, "addr", destination)
var tagStr = hex.EncodeToString(tag[:])
slog.Debug("建立数据通道", "tag", tagStr, "addr", destination)
// 向目标地址建立连接
var result = 1
var dstErr error
dst, err := net.Dial("tcp", destination)
if err != nil {
dstErr = fmt.Errorf("连接目标地址失败: %w", dstErr)
dstErr = ErrDstConnFailed
result = 0
}
defer utils.Close(dst)
// 向服务端建立连接
src, err := net.Dial("tcp", proxy)
if err != nil {
return errors.New("连接服务端失败")
}
defer utils.Close(src)
// 发送连接状态
var buf = make([]byte, 17)
@@ -168,39 +168,29 @@ func data(proxy string, destination string, tag [16]byte) error {
return dstErr
}
var waitSrc = make(chan error)
var waitSrc = make(chan struct{}, 1)
go func() {
defer utils.Close(dst)
_, err := io.Copy(dst, src)
switch {
case errors.Is(err, net.ErrClosed):
slog.Debug("网关连接意外关闭")
case err != nil:
slog.Error("读取网关数据失败", "err", err)
default:
slog.Debug("网关数据读取完成")
if ok, err := utils.WarpConnErr(err); !ok {
slog.Error("读取网关数据失败", "tag", tagStr, "err", err)
}
waitSrc <- err
waitSrc <- struct{}{}
}()
var waitDst = make(chan error)
var waitDst = make(chan struct{}, 1)
go func() {
defer utils.Close(src)
_, err := io.Copy(src, dst)
switch {
case errors.Is(err, net.ErrClosed):
slog.Debug("目标连接意外关闭")
case err != nil && !errors.Is(err, net.ErrClosed):
if ok, err := utils.WarpConnErr(err); !ok {
slog.Error("读取目标数据失败", "err", err)
default:
slog.Debug("目标数据读取完成")
}
waitDst <- err
waitDst <- struct{}{}
}()
// 等待任意一方关闭数据连接
select {
case <-waitSrc:
case <-waitDst:
}
// 等待连接全部安全关闭或超时
<-waitSrc
<-waitDst
return nil
}
@@ -261,7 +251,10 @@ func onConn(reader io.Reader, dataAddr string) (err error) {
// 异步建立数据通道
go func() {
err := data(dataAddr, addr, tag)
if err != nil {
switch {
case errors.Is(err, ErrDstConnFailed):
slog.Debug("目标地址连接失败", "tag", hex.EncodeToString(tag[:]), "addr", addr)
case err != nil:
slog.Error("建立数据通道失败", "err", err)
}
}()
@@ -273,3 +266,13 @@ type ConnCmd struct {
Tag [16]byte
Addr string
}
type Err string
func (e Err) Error() string {
return string(e)
}
const (
ErrDstConnFailed = Err("目标地址连接失败")
)

2
edge/env/env.go vendored
View File

@@ -40,7 +40,7 @@ func Init() error {
if Mode == "dev" {
slog.SetLogLoggerLevel(slog.LevelDebug)
} else {
slog.SetLogLoggerLevel(slog.LevelWarn)
slog.SetLogLoggerLevel(slog.LevelInfo)
}
return nil