Documentation ¶
Overview ¶
Package gfsmux is a multiplexing library for Golang.
It relies on an underlying connection to provide reliability and ordering, such as GFCP, and provides stream-oriented multiplexing over a single channel.
Index ¶
- Constants
- Variables
- func Smsb(size int) byte
- func VerifyConfig(Config *Config) error
- type Allocator
- type Config
- type Frame
- type Session
- func (s *Session) Accept() (io.ReadWriteCloser, error)
- func (s *Session) AcceptStream() (*Stream, error)
- func (s *Session) Close() error
- func (s *Session) IsClosed() bool
- func (s *Session) LocalAddr() net.Addr
- func (s *Session) NumStreams() int
- func (s *Session) Open() (io.ReadWriteCloser, error)
- func (s *Session) OpenStream() (*Stream, error)
- func (s *Session) RemoteAddr() net.Addr
- func (s *Session) SetDeadline(t time.Time) error
- func (s *Session) WriteFrame(f Frame) (n int, err error)
- func (s *Session) WriteFrameInternal(f Frame, deadline <-chan time.Time, Prio uint64) (int, error)
- type ShaperHeap
- type Stream
- func (s *Stream) Close() error
- func (s *Stream) GetDieCh() <-chan struct{}
- func (s *Stream) ID() uint32
- func (s *Stream) LocalAddr() net.Addr
- func (s *Stream) Read(b []byte) (n int, err error)
- func (s *Stream) RemoteAddr() net.Addr
- func (s *Stream) SetDeadline(t time.Time) error
- func (s *Stream) SetReadDeadline(t time.Time) error
- func (s *Stream) SetWriteDeadline(t time.Time) error
- func (s *Stream) Write(b []byte) (n int, err error)
- func (s *Stream) WriteTo(w io.Writer) (n int64, err error)
- type WriteRequest
- Bugs
Constants ¶
const ( // CmdSyn ... stream open CmdSyn byte = iota // CmdFin ... stream close, EOF CmdFin // CmdPsh ... push data CmdPsh // CmdNop ... noop CmdNop // CmdUpd ... notify bytes consumed by remote peer-end CmdUpd )
const (
// HeaderSize ...
HeaderSize = sizeOfVer + sizeOfCmd + sizeOfSid + sizeOfLength
)
Variables ¶
var ( // ErrInvalidProtocol version or bag negotiation. ErrInvalidProtocol = errors.New( "invalid protocol", ) // ErrConsumed protocol error, indicates desync ErrConsumed = errors.New( "peer consumed more than sent", ) // ErrGoAway overflow condition, restart it all. ErrGoAway = errors.New( "stream id overflows, should start a new Connection", ) // ErrTimeout ... ErrTimeout = &timeoutError{} // ErrWouldBlock error for invalid blocking I/O operating ErrWouldBlock = errors.New( "operation would block on IO", ) )
Functions ¶
func Smsb ¶
Smsb returns the position of most significiant bit http://supertech.csail.mit.edu/papers/debruijn.pdf
func VerifyConfig ¶
VerifyConfig is used to verify the sanity of Configuration
Types ¶
type Allocator ¶
type Allocator struct {
// contains filtered or unexported fields
}
Allocator for incoming frames, optimized to prevent overwriting after zeroing
func NewAllocator ¶
func NewAllocator() *Allocator
NewAllocator initiates a []byte allocator for frames less than 65536 bytes, the waste(memory fragmentation) of space allocation is guaranteed to be no more than 50%.
type Config ¶
type Config struct { // SMUX Protocol version, support 1,2 Version int // Disabled keepalive KeepAliveDisabled bool // KeepAliveInterval is how often to send a NOP command to the remote KeepAliveInterval time.Duration // KeepAliveTimeout is how long the session // will be closed if no data has arrived KeepAliveTimeout time.Duration // MaxFrameSize is used to control the maximum // frame size to sent to the remote MaxFrameSize int // MaxReceiveBuffer is used to control the maximum // number of data in the buffer pool MaxReceiveBuffer int // MaxStreamBuffer is used to control the maximum // number of data per stream MaxStreamBuffer int }
Config is used to tune the Smux session
func DefaultConfig ¶
func DefaultConfig() *Config
DefaultConfig is used to return a default Configuration
type Session ¶
type Session struct { Conn io.ReadWriteCloser Config *Config // contains filtered or unexported fields }
Session defines a multiplexed Connection for streams
func Client ¶
func Client( Conn io.ReadWriteCloser, Config *Config, ) ( *Session, error, )
Client is used to initialize a new client-side Connection.
func Server ¶
func Server( Conn io.ReadWriteCloser, Config *Config, ) ( *Session, error, )
Server is used to initialize a new server-side Connection.
func (*Session) Accept ¶
func ( s *Session, ) Accept() ( io.ReadWriteCloser, error, )
Accept Returns a generic ReadWriteCloser instead of smux.Stream
func (*Session) AcceptStream ¶
AcceptStream is used to block until the next available stream is ready to be accepted.
func (*Session) NumStreams ¶
NumStreams returns the number of currently open streams
func (*Session) Open ¶
func ( s *Session, ) Open() ( io.ReadWriteCloser, error, )
Open returns a generic ReadWriteCloser
func (*Session) OpenStream ¶
OpenStream is used to create a new stream
func (*Session) RemoteAddr ¶
RemoteAddr satisfies net.Conn interface
func (*Session) SetDeadline ¶
SetDeadline sets a deadline used by Accept* calls. A zero time value disables the deadline.
func (*Session) WriteFrame ¶
WriteFrame writes the frame to the underlying Connection and returns the number of bytes written if successful
type Stream ¶
type Stream struct {
// contains filtered or unexported fields
}
Stream implements net.Conn
func (*Stream) GetDieCh ¶
func ( s *Stream, ) GetDieCh() <-chan struct{}
GetDieCh returns a readonly chan which can be readable when the stream is to be closed.
func (*Stream) RemoteAddr ¶
RemoteAddr satisfies net.Conn interface
func (*Stream) SetDeadline ¶
SetDeadline sets both read and write deadlines as defined by net.Conn.SetDeadline. A zero time value disables the deadlines.
func (*Stream) SetReadDeadline ¶
SetReadDeadline sets the read deadline as defined by net.Conn.SetReadDeadline. A zero time value disables the deadline.
func (*Stream) SetWriteDeadline ¶
SetWriteDeadline sets the write deadline as defined by net.Conn.SetWriteDeadline. A zero time value disables the deadline.
type WriteRequest ¶
type WriteRequest struct { Prio uint64 // contains filtered or unexported fields }
WriteRequest ...
Notes ¶
Bugs ¶
Fix for https://github.com/xtaci/smux/issues/82 // XXX