kcp

package
v1.17.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 20, 2016 License: MIT Imports: 15 Imported by: 0

Documentation

Overview

Package kcp - A Fast and Reliable ARQ Protocol

Acknowledgement:

skywind3000@github for inventing the KCP protocol
xtaci@github for translating to Golang

Index

Constants

View Source
const (
	IKCP_RTO_NDL     = 30  // no delay min rto
	IKCP_RTO_MIN     = 100 // normal min rto
	IKCP_RTO_DEF     = 200
	IKCP_RTO_MAX     = 60000
	IKCP_CMD_PUSH    = 81 // cmd: push data
	IKCP_CMD_ACK     = 82 // cmd: ack
	IKCP_CMD_WASK    = 83 // cmd: window probe (ask)
	IKCP_CMD_WINS    = 84 // cmd: window size (tell)
	IKCP_ASK_SEND    = 1  // need to send IKCP_CMD_WASK
	IKCP_ASK_TELL    = 2  // need to send IKCP_CMD_WINS
	IKCP_WND_SND     = 32
	IKCP_WND_RCV     = 32
	IKCP_MTU_DEF     = 1350
	IKCP_ACK_FAST    = 3
	IKCP_INTERVAL    = 100
	IKCP_OVERHEAD    = 24
	IKCP_DEADLINK    = 20
	IKCP_THRESH_INIT = 2
	IKCP_THRESH_MIN  = 2
	IKCP_PROBE_INIT  = 7000   // 7 secs to probe window size
	IKCP_PROBE_LIMIT = 120000 // up to 120 secs to probe window
)

Variables

View Source
var (
	ErrUnknownDestination = errors.New("Destination IP can't be resolved.")
)

Functions

func DialKCP

func DialKCP(src v2net.Address, dest v2net.Destination) (internet.Connection, error)

func ListenKCP

func ListenKCP(address v2net.Address, port v2net.Port) (internet.Listener, error)

Types

type Authenticator

type Authenticator interface {
	HeaderSize() int
	// Encrypt encrypts the whole block in src into dst.
	// Dst and src may point at the same memory.
	Seal(buffer *alloc.Buffer)

	// Decrypt decrypts the whole block in src into dst.
	// Dst and src may point at the same memory.
	Open(buffer *alloc.Buffer) bool
}

func NewSimpleAuthenticator

func NewSimpleAuthenticator() Authenticator

type Command

type Command byte
var (
	CommandData      Command = 0
	CommandTerminate Command = 1
)

type Config

type Config struct {
	Mtu              int // Maximum transmission unit
	Tti              int
	UplinkCapacity   int
	DownlinkCapacity int
	Congestion       bool
}

func DefaultConfig

func DefaultConfig() Config

func (*Config) Apply

func (this *Config) Apply()

func (*Config) GetReceivingWindowSize

func (this *Config) GetReceivingWindowSize() int

func (*Config) GetSendingWindowSize

func (this *Config) GetSendingWindowSize() int

type ConnState

type ConnState byte
var (
	ConnStateActive       ConnState = 0
	ConnStateReadyToClose ConnState = 1
	ConnStatePeerClosed   ConnState = 2
	ConnStateClosed       ConnState = 4
)

type Connection

type Connection struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

Connection is a KCP connection over UDP.

func NewConnection

func NewConnection(conv uint32, writerCloser io.WriteCloser, local *net.UDPAddr, remote *net.UDPAddr, block Authenticator) *Connection

NewConnection create a new KCP connection between local and remote.

func (*Connection) Close

func (this *Connection) Close() error

Close closes the connection.

func (*Connection) Elapsed

func (this *Connection) Elapsed() uint32

func (*Connection) FetchInputFrom

func (this *Connection) FetchInputFrom(conn net.Conn)

func (*Connection) ForceTimeout

func (this *Connection) ForceTimeout()

func (*Connection) LocalAddr

func (this *Connection) LocalAddr() net.Addr

LocalAddr returns the local network address. The Addr returned is shared by all invocations of LocalAddr, so do not modify it.

func (*Connection) MarkPeerClose

func (this *Connection) MarkPeerClose()

func (*Connection) NotifyTermination

func (this *Connection) NotifyTermination()

func (*Connection) Read

func (this *Connection) Read(b []byte) (int, error)

Read implements the Conn Read method.

func (*Connection) RemoteAddr

func (this *Connection) RemoteAddr() net.Addr

RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it.

func (*Connection) Reusable

func (this *Connection) Reusable() bool

func (*Connection) SetDeadline

func (this *Connection) SetDeadline(t time.Time) error

SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.

func (*Connection) SetReadDeadline

func (this *Connection) SetReadDeadline(t time.Time) error

SetReadDeadline implements the Conn SetReadDeadline method.

func (*Connection) SetReusable

func (this *Connection) SetReusable(b bool)

func (*Connection) SetWriteDeadline

func (this *Connection) SetWriteDeadline(t time.Time) error

SetWriteDeadline implements the Conn SetWriteDeadline method.

func (*Connection) Terminate

func (this *Connection) Terminate()

func (*Connection) Write

func (this *Connection) Write(b []byte) (int, error)

Write implements the Conn Write method.

type KCP

type KCP struct {
	// contains filtered or unexported fields
}

KCP defines a single KCP connection

func NewKCP

func NewKCP(conv uint32, mtu uint32, output Output) *KCP

NewKCP create a new kcp control object, 'conv' must equal in two endpoint from the same connection.

func (*KCP) Check

func (kcp *KCP) Check(current uint32) uint32

Check determines when should you invoke ikcp_update: returns when you should invoke ikcp_update in millisec, if there is no ikcp_input/_send calling. you can call ikcp_update in that time, instead of call update repeatly. Important to reduce unnacessary ikcp_update invoking. use it to schedule ikcp_update (eg. implementing an epoll-like mechanism, or optimize ikcp_update when handling massive kcp connections)

func (*KCP) Input

func (kcp *KCP) Input(data []byte) int

Input when you received a low level packet (eg. UDP packet), call it

func (*KCP) NoDelay

func (kcp *KCP) NoDelay(nodelay, interval, resend int, congestionControl bool) int

NoDelay options fastest: ikcp_nodelay(kcp, 1, 20, 2, 1) nodelay: 0:disable(default), 1:enable interval: internal update timer interval in millisec, default is 100ms resend: 0:disable fast resend(default), 1:enable fast resend nc: 0:normal congestion control(default), 1:disable congestion control

func (*KCP) Recv

func (kcp *KCP) Recv(buffer []byte) (n int)

Recv is user/upper level recv: returns size, returns below zero for EAGAIN

func (*KCP) Send

func (kcp *KCP) Send(buffer []byte) int

Send is user/upper level send, returns below zero for error

func (*KCP) SetMtu

func (kcp *KCP) SetMtu(mtu int) int

SetMtu changes MTU size, default is 1400

func (*KCP) Update

func (kcp *KCP) Update(current uint32)

Update updates state (call it repeatedly, every 10ms-100ms), or you can ask ikcp_check when to call it again (without ikcp_input/_send calling). 'current' - current timestamp in millisec.

func (*KCP) WaitRcv

func (kcp *KCP) WaitRcv() int

func (*KCP) WaitSnd

func (kcp *KCP) WaitSnd() int

WaitSnd gets how many packet is waiting to be sent

func (*KCP) WndSize

func (kcp *KCP) WndSize(sndwnd, rcvwnd int) int

WndSize sets maximum window size: sndwnd=32, rcvwnd=32 by default

type Listener

type Listener struct {
	sync.Mutex
	// contains filtered or unexported fields
}

Listener defines a server listening for connections

func NewListener

func NewListener(address v2net.Address, port v2net.Port) (*Listener, error)

func (*Listener) Accept

func (this *Listener) Accept() (internet.Connection, error)

Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.

func (*Listener) Addr

func (this *Listener) Addr() net.Addr

Addr returns the listener's network address, The Addr returned is shared by all invocations of Addr, so do not modify it.

func (*Listener) Close

func (this *Listener) Close() error

Close stops listening on the UDP address. Already Accepted connections are not closed.

func (*Listener) OnReceive

func (this *Listener) OnReceive(payload *alloc.Buffer, src v2net.Destination)

func (*Listener) Remove

func (this *Listener) Remove(dest string)

type Option

type Option byte
var (
	OptionClose Option = 1
)

type Output

type Output func(buf []byte)

Output is a closure which captures conn and calls conn.Write

type Segment

type Segment struct {
	// contains filtered or unexported fields
}

Segment defines a KCP segment

func NewSegment

func NewSegment() *Segment

NewSegment creates a KCP segment

func (*Segment) Release

func (this *Segment) Release()

type SimpleAuthenticator

type SimpleAuthenticator struct{}

func (*SimpleAuthenticator) HeaderSize

func (this *SimpleAuthenticator) HeaderSize() int

func (*SimpleAuthenticator) Open

func (this *SimpleAuthenticator) Open(buffer *alloc.Buffer) bool

func (*SimpleAuthenticator) Seal

func (this *SimpleAuthenticator) Seal(buffer *alloc.Buffer)

type Writer

type Writer struct {
	// contains filtered or unexported fields
}

func (*Writer) Close

func (this *Writer) Close() error

func (*Writer) Write

func (this *Writer) Write(payload []byte) (int, error)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL