mirror of https://github.com/ehang-io/nps
72 lines
1.3 KiB
Go
72 lines
1.3 KiB
Go
package pmux
|
|
|
|
import (
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
type PortConn struct {
|
|
Conn net.Conn
|
|
rs []byte
|
|
readMore bool
|
|
start int
|
|
}
|
|
|
|
func newPortConn(conn net.Conn, rs []byte, readMore bool) *PortConn {
|
|
return &PortConn{
|
|
Conn: conn,
|
|
rs: rs,
|
|
readMore: readMore,
|
|
}
|
|
}
|
|
|
|
func (pConn *PortConn) Read(b []byte) (n int, err error) {
|
|
if len(b) < len(pConn.rs)-pConn.start {
|
|
defer func() {
|
|
pConn.start = pConn.start + len(b)
|
|
}()
|
|
return copy(b, pConn.rs), nil
|
|
}
|
|
if pConn.start < len(pConn.rs) {
|
|
defer func() {
|
|
pConn.start = len(pConn.rs)
|
|
}()
|
|
n = copy(b, pConn.rs[pConn.start:])
|
|
if !pConn.readMore {
|
|
return
|
|
}
|
|
}
|
|
var n2 = 0
|
|
n2, err = pConn.Conn.Read(b[n:])
|
|
n = n + n2
|
|
return
|
|
}
|
|
|
|
func (pConn *PortConn) Write(b []byte) (n int, err error) {
|
|
return pConn.Conn.Write(b)
|
|
}
|
|
|
|
func (pConn *PortConn) Close() error {
|
|
return pConn.Conn.Close()
|
|
}
|
|
|
|
func (pConn *PortConn) LocalAddr() net.Addr {
|
|
return pConn.Conn.LocalAddr()
|
|
}
|
|
|
|
func (pConn *PortConn) RemoteAddr() net.Addr {
|
|
return pConn.Conn.RemoteAddr()
|
|
}
|
|
|
|
func (pConn *PortConn) SetDeadline(t time.Time) error {
|
|
return pConn.Conn.SetDeadline(t)
|
|
}
|
|
|
|
func (pConn *PortConn) SetReadDeadline(t time.Time) error {
|
|
return pConn.Conn.SetReadDeadline(t)
|
|
}
|
|
|
|
func (pConn *PortConn) SetWriteDeadline(t time.Time) error {
|
|
return pConn.Conn.SetWriteDeadline(t)
|
|
}
|