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) }