8 Star 34 Fork 14

Cliven/gotlcp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
switch_server_conn.go 1.95 KB
一键复制 编辑 原始数据 按行查看 历史
package pa
import (
"crypto/tls"
"fmt"
"gitee.com/Trisia/gotlcp/tlcp"
"net"
"sync"
)
// ProtocolSwitchServerConn 自适应协议切换连接对象
type ProtocolSwitchServerConn struct {
net.Conn
lock *sync.Mutex // 防止并发调用
p *ProtocolDetectConn // 协议检测对象
ln *listener // 监听器上下文
wrapped net.Conn // 包装后的连接对象
}
// NewProtocolSwitchServerConn 创建一个自适应协议切换连接对象
// ln: 监听器上下文
// rawConn: 原始连接对象
func NewProtocolSwitchServerConn(ln *listener, rawConn net.Conn) *ProtocolSwitchServerConn {
p := &ProtocolDetectConn{Conn: rawConn}
return &ProtocolSwitchServerConn{
Conn: rawConn,
ln: ln,
p: p,
lock: new(sync.Mutex),
wrapped: nil,
}
}
// 推断连接类型
func (c *ProtocolSwitchServerConn) detect() error {
c.lock.Lock()
defer c.lock.Unlock()
if c.wrapped != nil {
return nil
}
err := c.p.ReadFirstHeader()
if err != nil {
return err
}
// 根据连接的记录层协议主版本号判断连接类型
switch c.p.major {
case 0x01:
// TLCP major version 0x01
if c.ln.tlcpCfg == nil {
return fmt.Errorf("pa: tlcp config not set")
}
c.wrapped = tlcp.Server(c.p, c.ln.tlcpCfg)
case 0x03:
// SSL/TLS major version 0x03
if c.ln.tlsCfg == nil {
return fmt.Errorf("pa: tls config not set")
}
c.wrapped = tls.Server(c.p, c.ln.tlsCfg)
default:
return notSupportError
}
return nil
}
// ProtectedConn 返回被保护的连接对象
func (c *ProtocolSwitchServerConn) ProtectedConn() net.Conn {
return c.wrapped
}
func (c *ProtocolSwitchServerConn) Read(b []byte) (n int, err error) {
if c.wrapped == nil {
err = c.detect()
if err != nil {
return 0, err
}
}
return c.wrapped.Read(b)
}
func (c *ProtocolSwitchServerConn) Write(b []byte) (n int, err error) {
if c.wrapped == nil {
err = c.detect()
if err != nil {
return 0, err
}
}
return c.wrapped.Write(b)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/Trisia/gotlcp.git
git@gitee.com:Trisia/gotlcp.git
Trisia
gotlcp
gotlcp
v1.3.22

搜索帮助