修复客户端断联未释放端口问题

This commit is contained in:
2025-03-05 14:14:11 +08:00
parent ae7fcfe484
commit 0144d1d46f
6 changed files with 134 additions and 128 deletions

View File

@@ -9,6 +9,7 @@ import (
"proxy-server/server/fwd/http"
"proxy-server/server/fwd/socks"
"strconv"
"strings"
"time"
"github.com/pkg/errors"
@@ -54,36 +55,43 @@ func (s *Server) Run() error {
m.SetReadTimeout(5 * time.Second)
defer m.Close()
go func() {
<-s.ctx.Done()
close(s.Conn)
m.Close()
}()
socksLs := m.Match(cmux.PrefixMatcher(string([]byte{0x05})))
defer utils.Close(socksLs)
go func() {
err = s.acceptSocks(socksLs)
if err != nil {
slog.Error("dispatcher socks accept error", "err", err)
if strings.Contains(err.Error(), "mux: server closed") {
return
}
slog.Warn("dispatcher socks accept error", "err", err)
}
}()
httpLs := m.Match(cmux.HTTP1Fast("PATCH"))
defer utils.Close(httpLs)
go func() {
err = s.acceptHttp(httpLs)
if err != nil {
slog.Error("dispatcher http accept error", "err", err)
if strings.Contains(err.Error(), "mux: server closed") {
return
}
slog.Warn("dispatcher http accept error", "err", err)
}
}()
err = m.Serve()
if err != nil {
return errors.Wrap(err, "dispatcher serve error")
}
errCh := make(chan error)
go func() {
err = m.Serve()
if err != nil {
err = errors.Wrap(err, "dispatcher serve error")
}
errCh <- err
}()
return nil
select {
case <-s.ctx.Done():
return nil
case err := <-errCh:
return err
}
}
func (s *Server) acceptHttp(ls net.Listener) error {