Skip to content

Commit 8a0baea

Browse files
committed
fix: 修复偶发的连接eof导致无法访问端口的情况
1 parent 020b03d commit 8a0baea

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

internal/proxy/handler.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,11 +191,17 @@ func (m *manager) listenAndServeApp(port uint16, app *fiber.App) error {
191191
//}
192192

193193
go func() {
194-
err := app.Listener(appLn)
194+
e := app.Listener(appLn)
195195
//err := app.Listen(fmt.Sprintf(":%d", port))
196-
if err != nil {
197-
logger.Error("服务异常停止: ", err)
196+
if e != nil {
197+
logger.Error("服务异常停止: ", e)
198198
delete(m.portToServer, port)
199+
200+
// 重新启动服务
201+
e = m.handleProxyServer(port)
202+
if e != nil {
203+
logger.Error("重新启动服务失败: ", e)
204+
}
199205
return
200206
}
201207
}()

internal/proxy/listener.go

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package proxy
22

33
import (
4+
logger "github.com/sirupsen/logrus"
45
"github.com/tjfoc/gmsm/gmtls"
56
"net"
67
)
@@ -28,13 +29,21 @@ func NewAppListener(listener net.Listener, tlsConfig *gmtls.Config) *AppListener
2829
func (l *AppListener) Accept() (net.Conn, error) {
2930
conn, err := l.Listener.Accept()
3031
if err != nil {
32+
logger.Error(err)
3133
return nil, err
3234
}
3335

3436
// 读取第一个字节,判断是否是TLS连接
3537
buffer := make([]byte, 1)
36-
_, err = conn.Read(buffer)
38+
var readNum int
39+
readNum, err = conn.Read(buffer)
3740
if err != nil {
41+
logger.WithField("readNum", readNum).Error(err)
42+
// 如果readNum为0,说明连接已经关闭
43+
if readNum == 0 {
44+
return conn, nil
45+
}
46+
// 如果readNum不为0,说明连接未关闭,但是读取数据失败
3847
return nil, err
3948
}
4049

@@ -71,11 +80,32 @@ func newBufferedConn(conn net.Conn, buf []byte) net.Conn {
7180
}
7281
}
7382

83+
// func (bc *bufferedConn) Read(p []byte) (int, error) {
84+
// if len(bc.buf) > 0 {
85+
// n := copy(p, bc.buf)
86+
// bc.buf = bc.buf[n:]
87+
// return n, nil
88+
// }
89+
// n, err := bc.Conn.Read(p)
90+
// if err != nil {
91+
// logger.Error(err)
92+
// }
93+
// return n, err
94+
// }
7495
func (bc *bufferedConn) Read(p []byte) (int, error) {
96+
totalN := 0
7597
if len(bc.buf) > 0 {
7698
n := copy(p, bc.buf)
7799
bc.buf = bc.buf[n:]
78-
return n, nil
100+
totalN += n
101+
}
102+
if totalN < len(p) {
103+
n, err := bc.Conn.Read(p[totalN:])
104+
if err != nil {
105+
logger.Error(err)
106+
return totalN, err
107+
}
108+
totalN += n
79109
}
80-
return bc.Conn.Read(p)
110+
return totalN, nil
81111
}

0 commit comments

Comments
 (0)