- go-hua/log 已弃用: *log.Logger 参数改为两方法接口 spmux.Logger (*logrus.Logger 天然满足), 传 nil 静默(logErrorf/logDebugf 判空) - 协议识别改用 zogo/httpprobe; 测试与例程同步适配 - 附测试、examples/spmux 例程(含 Logger 适配演示)与包 README
73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
package spmux
|
|
|
|
import (
|
|
"bufio"
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
// PortConn 复用器分发出来的连接,协议识别时窥探的数据保留在缓冲区中
|
|
type PortConn struct {
|
|
conn net.Conn
|
|
reader *bufio.Reader
|
|
}
|
|
|
|
// newPortConn 包装原始连接
|
|
func newPortConn(conn net.Conn) *PortConn {
|
|
c := &PortConn{
|
|
conn: conn,
|
|
}
|
|
c.reader = bufio.NewReaderSize(conn, 0x1000)
|
|
return c
|
|
}
|
|
|
|
// Peek 窥探数据
|
|
func (p *PortConn) Peek(n int) ([]byte, error) {
|
|
return p.reader.Peek(n)
|
|
}
|
|
|
|
// Buffered 从当前缓冲区读取的字节数
|
|
func (p *PortConn) Buffered() int {
|
|
return p.reader.Buffered()
|
|
}
|
|
|
|
// Read 读取数据(先读出缓冲区中已窥探的数据)
|
|
func (p *PortConn) Read(b []byte) (n int, err error) {
|
|
return p.reader.Read(b)
|
|
}
|
|
|
|
// Write 写入数据
|
|
func (p *PortConn) Write(b []byte) (n int, err error) {
|
|
return p.conn.Write(b)
|
|
}
|
|
|
|
// Close 关闭连接
|
|
func (p *PortConn) Close() error {
|
|
return p.conn.Close()
|
|
}
|
|
|
|
// LocalAddr 返回本地网络地址
|
|
func (p *PortConn) LocalAddr() net.Addr {
|
|
return p.conn.LocalAddr()
|
|
}
|
|
|
|
// RemoteAddr 返回对端网络地址
|
|
func (p *PortConn) RemoteAddr() net.Addr {
|
|
return p.conn.RemoteAddr()
|
|
}
|
|
|
|
// SetDeadline 设置读写超时时间
|
|
func (p *PortConn) SetDeadline(t time.Time) error {
|
|
return p.conn.SetDeadline(t)
|
|
}
|
|
|
|
// SetReadDeadline 设置读超时时间
|
|
func (p *PortConn) SetReadDeadline(t time.Time) error {
|
|
return p.conn.SetReadDeadline(t)
|
|
}
|
|
|
|
// SetWriteDeadline 设置写超时时间
|
|
func (p *PortConn) SetWriteDeadline(t time.Time) error {
|
|
return p.conn.SetWriteDeadline(t)
|
|
}
|