优化数据连接处理逻辑,避免数据通道连接空等待问题;授权部分添加全局白名单支持;现在节点丢失连接后不会清空授权数据

This commit is contained in:
2025-05-23 18:59:53 +08:00
parent 12038f0af7
commit 52907b3fae
10 changed files with 170 additions and 92 deletions

View File

@@ -118,7 +118,6 @@ func ctrl(ctx context.Context, id int32, host string) error {
case <-ctx.Done():
return
case tick := <-ticker.C:
slog.Debug("发送心跳", "time", tick)
err := sendPing(conn)
if err != nil {
slog.Error("发送心跳失败", "time", tick, "err", err)
@@ -225,20 +224,40 @@ func data(proxy string, dest string, tag [16]byte) error {
return dstErr
}
var waitSrc = make(chan error)
go func() {
defer utils.Close(dst)
_, err := io.Copy(dst, src)
if err != nil && !errors.Is(err, net.ErrClosed) {
slog.Error("上行流量代理失败", "err", err)
switch {
case errors.Is(err, net.ErrClosed):
slog.Debug("网关连接意外关闭")
case err != nil:
slog.Error("读取网关数据失败", "err", err)
default:
slog.Debug("网关数据读取完成")
}
waitSrc <- err
}()
var waitDst = make(chan error)
go func() {
defer utils.Close(src)
_, err := io.Copy(src, dst)
if err != nil && !errors.Is(err, net.ErrClosed) {
slog.Error("下行流量代理失败", "err", err)
switch {
case errors.Is(err, net.ErrClosed):
slog.Debug("目标连接意外关闭")
case err != nil && !errors.Is(err, net.ErrClosed):
slog.Error("读取目标数据失败", "err", err)
default:
slog.Debug("目标数据读取完成")
}
waitDst <- err
}()
// 等待任意一方关闭数据连接
select {
case <-waitSrc:
case <-waitDst:
}
return nil
}