mirror of https://github.com/ehang-io/nps
客户端断线重连bug修复
parent
e6c2de7d9f
commit
c35ce71e7c
24
conn.go
24
conn.go
|
@ -88,12 +88,16 @@ func (s *Conn) ReadFlag() (string, error) {
|
||||||
|
|
||||||
//读取host
|
//读取host
|
||||||
func (s *Conn) GetHostFromConn() (typeStr string, host string, err error) {
|
func (s *Conn) GetHostFromConn() (typeStr string, host string, err error) {
|
||||||
|
retry:
|
||||||
ltype := make([]byte, 3)
|
ltype := make([]byte, 3)
|
||||||
_, err = s.Read(ltype)
|
_, err = s.Read(ltype)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
typeStr = string(ltype)
|
typeStr = string(ltype)
|
||||||
|
if typeStr == TEST_FLAG {
|
||||||
|
goto retry
|
||||||
|
}
|
||||||
len, err := s.GetLen()
|
len, err := s.GetLen()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
@ -200,17 +204,21 @@ func (s *Conn) WriteCompress(b []byte, compress int) (n int, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Conn) wError() {
|
func (s *Conn) wError() (int, error) {
|
||||||
s.conn.Write([]byte(RES_MSG))
|
return s.conn.Write([]byte(RES_MSG))
|
||||||
}
|
}
|
||||||
func (s *Conn) wSign() {
|
func (s *Conn) wSign() (int, error) {
|
||||||
s.conn.Write([]byte(RES_SIGN))
|
return s.conn.Write([]byte(RES_SIGN))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Conn) wMain() {
|
func (s *Conn) wMain() (int, error) {
|
||||||
s.conn.Write([]byte(WORK_MAIN))
|
return s.conn.Write([]byte(WORK_MAIN))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Conn) wChan() {
|
func (s *Conn) wChan() (int, error) {
|
||||||
s.conn.Write([]byte(WORK_CHAN))
|
return s.conn.Write([]byte(WORK_CHAN))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Conn) wTest() (int, error) {
|
||||||
|
return s.conn.Write([]byte(TEST_FLAG))
|
||||||
}
|
}
|
||||||
|
|
8
main.go
8
main.go
|
@ -10,12 +10,12 @@ var (
|
||||||
configPath = flag.String("config", "config.json", "配置文件路径")
|
configPath = flag.String("config", "config.json", "配置文件路径")
|
||||||
tcpPort = flag.Int("tcpport", 8284, "Socket连接或者监听的端口")
|
tcpPort = flag.Int("tcpport", 8284, "Socket连接或者监听的端口")
|
||||||
httpPort = flag.Int("httpport", 8024, "当mode为server时为服务端监听端口,当为mode为client时为转发至本地客户端的端口")
|
httpPort = flag.Int("httpport", 8024, "当mode为server时为服务端监听端口,当为mode为client时为转发至本地客户端的端口")
|
||||||
rpMode = flag.String("mode", "client", "启动模式,可选为client、server")
|
rpMode = flag.String("mode", "client", "启动模式,可选为client|server")
|
||||||
tunnelTarget = flag.String("target", "10.1.50.203:80", "远程目标")
|
tunnelTarget = flag.String("target", "10.1.50.203:80", "远程目标")
|
||||||
verifyKey = flag.String("vkey", "", "验证密钥")
|
verifyKey = flag.String("vkey", "", "验证密钥")
|
||||||
u = flag.String("u", "", "sock5验证用户名")
|
u = flag.String("u", "", "socks5验证用户名")
|
||||||
p = flag.String("p", "", "sock5验证密码")
|
p = flag.String("p", "", "socks5验证密码")
|
||||||
compress = flag.String("compress", "", "数据压缩(gizp|snappy)")
|
compress = flag.String("compress", "", "数据压缩(gzip|snappy)")
|
||||||
config Config
|
config Config
|
||||||
err error
|
err error
|
||||||
DataEncode int
|
DataEncode int
|
||||||
|
|
15
server.go
15
server.go
|
@ -15,6 +15,9 @@ const (
|
||||||
WORK_CHAN = "chan"
|
WORK_CHAN = "chan"
|
||||||
RES_SIGN = "sign"
|
RES_SIGN = "sign"
|
||||||
RES_MSG = "msg0"
|
RES_MSG = "msg0"
|
||||||
|
TEST_FLAG = "tst"
|
||||||
|
CONN_TCP = "tcp"
|
||||||
|
CONN_UDP = "udp"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HttpModeServer struct {
|
type HttpModeServer struct {
|
||||||
|
@ -172,11 +175,12 @@ func (s *TunnelModeServer) startTunnelServer() {
|
||||||
//TODO:这种实现方式……
|
//TODO:这种实现方式……
|
||||||
//tcp隧道模式
|
//tcp隧道模式
|
||||||
func ProcessTunnel(c *Conn, s *TunnelModeServer) error {
|
func ProcessTunnel(c *Conn, s *TunnelModeServer) error {
|
||||||
retry:
|
|
||||||
link := s.GetTunnel()
|
link := s.GetTunnel()
|
||||||
if _, err := link.WriteHost("tcp", s.tunnelTarget); err != nil {
|
if _, err := link.WriteHost(CONN_TCP, s.tunnelTarget); err != nil {
|
||||||
link.Close()
|
link.Close()
|
||||||
goto retry
|
c.Close()
|
||||||
|
log.Println(err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
go relay(link, c, DataEncode)
|
go relay(link, c, DataEncode)
|
||||||
relay(c, link, DataDecode)
|
relay(c, link, DataDecode)
|
||||||
|
@ -190,11 +194,12 @@ func ProcessHttp(c *Conn, s *TunnelModeServer) error {
|
||||||
c.Close()
|
c.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
retry:
|
|
||||||
link := s.GetTunnel()
|
link := s.GetTunnel()
|
||||||
if _, err := link.WriteHost("tcp", addr); err != nil {
|
if _, err := link.WriteHost("tcp", addr); err != nil {
|
||||||
|
c.Close()
|
||||||
link.Close()
|
link.Close()
|
||||||
goto retry
|
log.Println(err)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
if method == "CONNECT" {
|
if method == "CONNECT" {
|
||||||
fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
|
fmt.Fprint(c, "HTTP/1.1 200 Connection established\r\n")
|
||||||
|
|
5
sock5.go
5
sock5.go
|
@ -135,9 +135,9 @@ func (s *Sock5ModeServer) doConnect(c net.Conn, command uint8) (proxyConn *Conn,
|
||||||
s.sendReply(c, succeeded)
|
s.sendReply(c, succeeded)
|
||||||
var ltype string
|
var ltype string
|
||||||
if command == associateMethod {
|
if command == associateMethod {
|
||||||
ltype = "udp"
|
ltype = CONN_UDP
|
||||||
} else {
|
} else {
|
||||||
ltype = "tcp"
|
ltype = CONN_TCP
|
||||||
}
|
}
|
||||||
_, err = client.WriteHost(ltype, addr)
|
_, err = client.WriteHost(ltype, addr)
|
||||||
return client, nil
|
return client, nil
|
||||||
|
@ -154,6 +154,7 @@ func (s *Sock5ModeServer) handleConnect(c net.Conn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// passive mode
|
// passive mode
|
||||||
func (s *Sock5ModeServer) handleBind(c net.Conn) {
|
func (s *Sock5ModeServer) handleBind(c net.Conn) {
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,5 +100,12 @@ func (s *Tunnel) GetTunnel() *Conn {
|
||||||
if len(s.tunnelList) < 10 { //新建通道
|
if len(s.tunnelList) < 10 { //新建通道
|
||||||
go s.newChan()
|
go s.newChan()
|
||||||
}
|
}
|
||||||
return <-s.tunnelList
|
retry:
|
||||||
|
c := <-s.tunnelList
|
||||||
|
_, err := c.wTest()
|
||||||
|
if err != nil {
|
||||||
|
c.Close()
|
||||||
|
goto retry
|
||||||
|
}
|
||||||
|
return c
|
||||||
}
|
}
|
||||||
|
|
5
udp.go
5
udp.go
|
@ -56,7 +56,10 @@ func (s *UdpModeServer) startTunnelServer() {
|
||||||
|
|
||||||
func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
|
func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
|
||||||
conn := s.GetTunnel()
|
conn := s.GetTunnel()
|
||||||
conn.WriteHost("udp", s.tunnelTarget)
|
if _, err := conn.WriteHost(CONN_UDP, s.tunnelTarget);err!=nil{
|
||||||
|
conn.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
buf := make([]byte, 1024)
|
buf := make([]byte, 1024)
|
||||||
|
|
Loading…
Reference in New Issue