代码拉取完成,页面将自动刷新
/**
* @Time: 2019/1/15 14:50
* @Author: wangmin
* @File: inner_connection.go
* @Software: GoLand
*/
package connection
import (
"encoding/json"
"io"
"log"
"net"
"strconv"
"strings"
"time"
"transponder/event"
)
const StatusInit = 0
const StatusOk = 2
const StatusProxy = 3
const StatusClose = 4
// 内部连接对象
type InnerConnection struct {
Id uint64 // 连接id
Status int // 连接状态
AuthKey string // 授权码
Created int64 // 创建时间
Conn net.Conn // 内网服务连接对象
proxyConn net.Conn // 外网连接
StatusMonitor func(id uint64, status int)
}
// 读取内网服务器上行数据
func (ic *InnerConnection) Read() {
for {
if ic.Status == StatusProxy || ic.Status == StatusClose {
return
}
buf := make([]byte, event.PackageLength)
n, err := ic.Conn.Read(buf)
if err != nil {
log.Println("read from inner server connection error:" + err.Error())
ic.Close()
return
}
if n != event.PackageLength {
log.Println("read from inner server connection error data length error")
ic.Close()
return
}
signal := &event.Signal{}
err = json.Unmarshal(buf, signal)
if err != nil {
log.Println("cant not parse inner server signal data:" + string(buf) + " error:" + err.Error())
ic.Close()
return
}
switch signal.T {
case event.Ping:
// do nothing
case event.Auth:
if strings.TrimRight(signal.Ext, " ") != ic.AuthKey {
log.Println("auth key " + ic.AuthKey + " != " + signal.Ext)
ic.Close()
return
}
ic.Status = StatusOk
ic.StatusMonitor(ic.Id, StatusOk)
case event.StartProxy:
ic.Status = StatusProxy
ic.StatusMonitor(ic.Id, StatusProxy)
ic.startProxy()
return
default:
log.Println("unknown inner server event:" + strconv.Itoa(signal.T))
ic.Close()
return
}
}
}
// 开始转发
func (ic *InnerConnection) ProxyRequest(conn net.Conn) {
ic.proxyConn = conn
_, err := ic.Conn.Write(event.GenerateSignal(event.StartProxy, ""))
if err != nil {
log.Println("send request fail:" + err.Error())
ic.Close()
return
}
time.AfterFunc(time.Second*5, func() {
if ic.Status != StatusProxy && ic.Status != StatusClose {
log.Println("wait for inner service timeout")
ic.Close()
}
})
}
// 开始转发
func (ic *InnerConnection) startProxy() {
// log.Println("外部服务开始转发")
_ = ic.Conn.SetReadDeadline(time.Now().Add(time.Second * 30))
_ = ic.Conn.SetWriteDeadline(time.Now().Add(time.Second * 30))
_ = ic.proxyConn.SetReadDeadline(time.Now().Add(time.Second * 30))
_ = ic.proxyConn.SetWriteDeadline(time.Now().Add(time.Second * 30))
go func() {
if ic.proxyConn != nil && ic.Conn != nil {
_, _ = io.Copy(ic.proxyConn, ic.Conn)
}
if ic.proxyConn != nil {
_ = ic.proxyConn.Close()
}
}()
go func() {
if ic.Conn != nil && ic.proxyConn != nil {
_, _ = io.Copy(ic.Conn, ic.proxyConn)
}
if ic != nil {
ic.Close()
}
}()
}
// 关闭连接
func (ic *InnerConnection) Close() {
ic.Status = StatusClose
ic.StatusMonitor(ic.Id, StatusClose)
if ic.Conn != nil {
_ = ic.Conn.Close()
ic.Conn = nil
}
if ic.proxyConn != nil {
_ = ic.proxyConn.Close()
ic.proxyConn = nil
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。