重新规划网关与节点的交互协议,实现统一命令位的识别和处理
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
package fwd
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"github.com/google/uuid"
|
||||
"io"
|
||||
"log/slog"
|
||||
"net"
|
||||
@@ -16,7 +18,7 @@ import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
func (s *Service) startDataTun() error {
|
||||
func (s *Service) listenData() error {
|
||||
dataPort := env.AppDataPort
|
||||
slog.Debug("监听数据通道", slog.Uint64("port", uint64(dataPort)))
|
||||
|
||||
@@ -57,38 +59,34 @@ func (s *Service) startDataTun() error {
|
||||
}
|
||||
|
||||
func (s *Service) processDataConn(client net.Conn) error {
|
||||
var reader = bufio.NewReader(client)
|
||||
|
||||
// 接收 status
|
||||
status, err := utils.ReadByte(client)
|
||||
// 接收连接结果
|
||||
var buf = make([]byte, 17)
|
||||
_, err := io.ReadFull(reader, buf)
|
||||
if err != nil {
|
||||
return fmt.Errorf("从客户端获取 status 失败: %w", err)
|
||||
return fmt.Errorf("从客户端获取连接结果失败: %w", err)
|
||||
}
|
||||
|
||||
// 接收 tag
|
||||
tagLen, err := utils.ReadByte(client)
|
||||
if err != nil {
|
||||
return fmt.Errorf("从客户端获取 tag 失败: %w", err)
|
||||
}
|
||||
tagBuf, err := utils.ReadBuffer(client, int(tagLen))
|
||||
if err != nil {
|
||||
return fmt.Errorf("从客户端获取 tag 失败: %w", err)
|
||||
}
|
||||
tag := string(tagBuf)
|
||||
tag := buf[0:16]
|
||||
status := buf[16]
|
||||
|
||||
// 找到用户连接
|
||||
user, ok := s.userConnMap.LoadAndDelete(tag)
|
||||
// 加载用户连接
|
||||
var tagStr = uuid.UUID(tag).String()
|
||||
user, ok := s.userConnMap.LoadAndDelete(tagStr)
|
||||
if !ok {
|
||||
return errors.New("用户连接已关闭,tag:" + tag)
|
||||
return fmt.Errorf("用户连接已关闭,tag:%s", tagStr)
|
||||
}
|
||||
defer utils.Close(user)
|
||||
data := time.Now()
|
||||
|
||||
// 检查状态
|
||||
if status != 1 {
|
||||
return errors.New("目标地址建立连接失败")
|
||||
}
|
||||
|
||||
// 数据转发
|
||||
// 转发数据
|
||||
data := time.Now()
|
||||
|
||||
userPipeReader, userPipeWriter := io.Pipe()
|
||||
defer utils.Close(userPipeWriter)
|
||||
teeUser := io.TeeReader(user, userPipeWriter)
|
||||
@@ -110,7 +108,7 @@ func (s *Service) processDataConn(client net.Conn) error {
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
_, err := io.Copy(user, client)
|
||||
_, err := io.Copy(user, reader)
|
||||
if err != nil {
|
||||
slog.Error("数据转发失败 client->user", "err", err)
|
||||
}
|
||||
@@ -118,7 +116,7 @@ func (s *Service) processDataConn(client net.Conn) error {
|
||||
|
||||
select {
|
||||
case <-s.ctx.Done():
|
||||
case <-utils.ChanWgWait(s.ctx, &wg):
|
||||
case <-utils.WgWait(&wg):
|
||||
}
|
||||
|
||||
proxy := time.Now()
|
||||
|
||||
Reference in New Issue
Block a user