Documentation ¶
Overview ¶
好用的kcp 爱 来自 hk4e-go
Package kcp-go is a Reliable-UDP library for golang.
This library intents to provide a smooth, resilient, ordered, error-checked and anonymous delivery of streams over UDP packets.
The interfaces of this package aims to be compatible with Net.Conn in standard library, but offers powerful features for advanced users.
Index ¶
- Constants
- Variables
- func BuildEnet(connType string, enetType uint32, sessionId uint32, conv uint32) []byte
- func Dial(raddr string) (net.Conn, error)
- func Listen(laddr string) (net.Listener, error)
- func ParseEnet(data []byte) (connType string, enetType uint32, sessionId uint32, conv uint32, ...)
- type Enet
- type KCP
- func (kcp *KCP) Check() uint32
- func (kcp *KCP) Input(data []byte, regular, ackNoDelay bool) int
- func (kcp *KCP) NoDelay(nodelay, interval, resend, nc int) int
- func (kcp *KCP) PeekSize() (length int)
- func (kcp *KCP) Recv(buffer []byte) (n int)
- func (kcp *KCP) ReleaseTX()
- func (kcp *KCP) ReserveBytes(n int) bool
- func (kcp *KCP) Send(buffer []byte) int
- func (kcp *KCP) SetMtu(mtu int) int
- func (kcp *KCP) Update()
- func (kcp *KCP) WaitSnd() int
- func (kcp *KCP) WndSize(sndwnd, rcvwnd int) int
- type Listener
- func (l *Listener) Accept() (net.Conn, error)
- func (l *Listener) AcceptKCP() (*UDPSession, error)
- func (l *Listener) Addr() net.Addr
- func (l *Listener) Close() error
- func (l *Listener) GetEnetNotifyChan() chan *Enet
- func (l *Listener) SendEnetNotifyToPeer(enet *Enet)
- func (l *Listener) SetDSCP(dscp int) error
- func (l *Listener) SetDeadline(t time.Time) error
- func (l *Listener) SetReadBuffer(bytes int) error
- func (l *Listener) SetReadDeadline(t time.Time) error
- func (l *Listener) SetWriteBuffer(bytes int) error
- func (l *Listener) SetWriteDeadline(t time.Time) error
- type Snmp
- type TimedSched
- type UDPSession
- func (s *UDPSession) Close() error
- func (s *UDPSession) GetConv() uint32
- func (s *UDPSession) GetMaxPayloadLen() int
- func (s *UDPSession) GetRTO() uint32
- func (s *UDPSession) GetRawConv() uint64
- func (s *UDPSession) GetSRTT() int32
- func (s *UDPSession) GetSRTTVar() int32
- func (s *UDPSession) GetSessionId() uint32
- func (s *UDPSession) LocalAddr() net.Addr
- func (s *UDPSession) Read(b []byte) (n int, err error)
- func (s *UDPSession) RemoteAddr() net.Addr
- func (s *UDPSession) SendEnetNotifyToPeer(enet *Enet)
- func (s *UDPSession) SetACKNoDelay(nodelay bool)
- func (s *UDPSession) SetDSCP(dscp int) error
- func (s *UDPSession) SetDUP(dup int)
- func (s *UDPSession) SetDeadline(t time.Time) error
- func (s *UDPSession) SetIdleTicker(t time.Duration)
- func (s *UDPSession) SetMtu(mtu int) bool
- func (s *UDPSession) SetNoDelay(nodelay, interval, resend, nc int)
- func (s *UDPSession) SetReadBuffer(bytes int) error
- func (s *UDPSession) SetReadDeadline(t time.Time) error
- func (s *UDPSession) SetStreamMode(enable bool)
- func (s *UDPSession) SetWindowSize(sndwnd, rcvwnd int)
- func (s *UDPSession) SetWriteBuffer(bytes int) error
- func (s *UDPSession) SetWriteDeadline(t time.Time) error
- func (s *UDPSession) SetWriteDelay(delay bool)
- func (s *UDPSession) Write(b []byte) (n int, err error)
- func (s *UDPSession) WriteBuffers(v [][]byte) (n int, err error)
Constants ¶
const ( ConnEnetSyn = "ConnEnetSyn" ConnEnetEst = "ConnEnetEst" ConnEnetFin = "ConnEnetFin" ConnEnetAddrChange = "ConnEnetAddrChange" )
Enet连接状态类型
const ( EnetTimeout = 0 EnetClientClose = 1 EnetClientRebindFail = 2 EnetClientShutdown = 3 EnetServerRelogin = 4 EnetServerKick = 5 EnetServerShutdown = 6 EnetNotFoundSession = 7 EnetLoginUnfinished = 8 EnetPacketFreqTooHigh = 9 EnetPingTimeout = 10 EnetTransferFailed = 11 EnetServerKillClient = 12 EnetCheckMoveSpeed = 13 EnetAccountPasswordChange = 14 EnetSecurityKick = 15 EnetLuaShellTimeout = 16 EnetSDKFailKick = 17 EnetPacketCostTime = 18 EnetPacketUnionFreq = 19 EnetWaitSndMax = 20 EnetClientEditorConnectKey = 987654321 EnetClientConnectKey = 255 )
Enet事件类型
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 = 1400 IKCP_ACK_FAST = 3 IKCP_INTERVAL = 100 IKCP_OVERHEAD = 24 + 4 // KCP组合会话id是8个字节 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 IKCP_SN_OFFSET = 12 + 4 // KCP组合会话id是8个字节 )
Variables ¶
var MagicEnetEstHead, _ = hex.DecodeString("00000145")
var MagicEnetEstTail, _ = hex.DecodeString("14514545")
var MagicEnetFinHead, _ = hex.DecodeString("00000194")
var MagicEnetFinTail, _ = hex.DecodeString("19419494")
var MagicEnetSynHead, _ = hex.DecodeString("000000ff")
Enet连接状态类型幻数
var MagicEnetSynTail, _ = hex.DecodeString("ffffffff")
var SystemTimedSched = NewTimedSched(runtime.NumCPU())
SystemTimedSched is the library level timed-scheduler
Functions ¶
func Dial ¶
Dial connects to the remote address "raddr" on the network "udp" without encryption and FEC
Types ¶
type KCP ¶
type KCP struct {
// contains filtered or unexported fields
}
KCP defines a single KCP connection
func NewKCP ¶
NewKCP create a new kcp state machine
'conv' must be equal in the connection peers, or else data will be silently rejected.
'output' function will be called whenever these is data to be sent on wire.
func (*KCP) Check ¶
(deprecated)
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 ¶
Input a packet into kcp state machine.
'regular' indicates it's a real data packet from remote, and it means it's not generated from ReedSolomon codecs.
'ackNoDelay' will trigger immediate ACK, but surely it will not be efficient in bandwidth
func (*KCP) NoDelay ¶
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 ¶
Receive data from kcp state machine
Return number of bytes read.
Return -1 when there is no readable data.
Return -2 if len(buffer) is smaller than kcp.PeekSize().
func (*KCP) ReserveBytes ¶
ReserveBytes keeps n bytes untouched from the beginning of the buffer, the output_callback function should be aware of this.
Return false if n >= mss
func (*KCP) Update ¶
func (kcp *KCP) Update()
(deprecated)
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.
type Listener ¶
type Listener struct {
// contains filtered or unexported fields
}
Listener defines a server which will be waiting to accept incoming connections
func ListenWithOptions ¶
ListenWithOptions listens for incoming KCP packets addressed to the local address laddr on the network "udp" with packet encryption.
'block' is the block encryption algorithm to encrypt packets.
'dataShards', 'parityShards' specify how many parity packets will be generated following the data packets.
Check https://github.com/klauspost/reedsolomon for details
func ServeConn ¶
func ServeConn(conn net.PacketConn) (*Listener, error)
ServeConn serves KCP protocol for a single packet connection.
func (*Listener) Accept ¶
Accept implements the Accept method in the Listener interface; it waits for the next call and returns a generic Conn.
func (*Listener) AcceptKCP ¶
func (l *Listener) AcceptKCP() (*UDPSession, error)
AcceptKCP accepts a KCP connection
func (*Listener) 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) GetEnetNotifyChan ¶
func (*Listener) SendEnetNotifyToPeer ¶
func (*Listener) SetDSCP ¶
SetDSCP sets the 6bit DSCP field in IPv4 header, or 8bit Traffic Class in IPv6 header.
if the underlying connection has implemented `func SetDSCP(int) error`, SetDSCP() will invoke this function instead.
func (*Listener) SetDeadline ¶
SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.
func (*Listener) SetReadBuffer ¶
SetReadBuffer sets the socket read buffer for the Listener
func (*Listener) SetReadDeadline ¶
SetReadDeadline implements the Conn SetReadDeadline method.
func (*Listener) SetWriteBuffer ¶
SetWriteBuffer sets the socket write buffer for the Listener
type Snmp ¶
type Snmp struct { BytesSent uint64 // bytes sent from upper level BytesReceived uint64 // bytes received to upper level MaxConn uint64 // max number of connections ever reached ActiveOpens uint64 // accumulated active open connections PassiveOpens uint64 // accumulated passive open connections CurrEstab uint64 // current number of established connections KCPInErrors uint64 // packet iput errors reported from KCP InPkts uint64 // incoming packets count OutPkts uint64 // outgoing packets count InSegs uint64 // incoming KCP segments OutSegs uint64 // outgoing KCP segments InBytes uint64 // UDP bytes received OutBytes uint64 // UDP bytes sent RetransSegs uint64 // accmulated retransmited segments FastRetransSegs uint64 // accmulated fast retransmitted segments EarlyRetransSegs uint64 // accmulated early retransmitted segments LostSegs uint64 // number of segs inferred as lost RepeatSegs uint64 // number of segs duplicated }
Snmp defines network statistics indicator
var DefaultSnmp *Snmp
DefaultSnmp is the global KCP connection statistics collector
type TimedSched ¶
type TimedSched struct {
// contains filtered or unexported fields
}
TimedSched represents the control struct for timed parallel scheduler
func NewTimedSched ¶
func NewTimedSched(parallel int) *TimedSched
NewTimedSched creates a parallel-scheduler with given parallelization
func (*TimedSched) Put ¶
func (ts *TimedSched) Put(f func(), deadline time.Time)
Put a function 'f' awaiting to be executed at 'deadline'
type UDPSession ¶
type UDPSession struct {
// contains filtered or unexported fields
}
UDPSession defines a KCP session implemented by UDP
func DialWithOptions ¶
func DialWithOptions(raddr string) (*UDPSession, error)
DialWithOptions connects to the remote address "raddr" on the network "udp" with packet encryption
'block' is the block encryption algorithm to encrypt packets.
'dataShards', 'parityShards' specify how many parity packets will be generated following the data packets.
Check https://github.com/klauspost/reedsolomon for details
func NewConn ¶
func NewConn(raddr string, conn net.PacketConn) (*UDPSession, error)
NewConn establishes a session and talks KCP protocol over a packet connection.
func NewConn2 ¶
func NewConn2(raddr net.Addr, conn net.PacketConn) (*UDPSession, error)
NewConn2 establishes a session and talks KCP protocol over a packet connection.
func NewConn3 ¶
func NewConn3(convid uint64, raddr net.Addr, conn net.PacketConn) (*UDPSession, error)
NewConn3 establishes a session and talks KCP protocol over a packet connection.
func (*UDPSession) GetMaxPayloadLen ¶
func (s *UDPSession) GetMaxPayloadLen() int
func (*UDPSession) GetRTO ¶
func (s *UDPSession) GetRTO() uint32
GetRTO gets current rto of the session
func (*UDPSession) GetRawConv ¶
func (s *UDPSession) GetRawConv() uint64
GetRawConv gets conversation id of a session 获取KCP组合会话id
func (*UDPSession) GetSRTT ¶
func (s *UDPSession) GetSRTT() int32
GetSRTT gets current srtt of the session
func (*UDPSession) GetSRTTVar ¶
func (s *UDPSession) GetSRTTVar() int32
GetSRTTVar gets current rtt variance of the session
func (*UDPSession) LocalAddr ¶
func (s *UDPSession) 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 (*UDPSession) Read ¶
func (s *UDPSession) Read(b []byte) (n int, err error)
Read implements Net.Conn
func (*UDPSession) RemoteAddr ¶
func (s *UDPSession) 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 (*UDPSession) SendEnetNotifyToPeer ¶
func (s *UDPSession) SendEnetNotifyToPeer(enet *Enet)
func (*UDPSession) SetACKNoDelay ¶
func (s *UDPSession) SetACKNoDelay(nodelay bool)
SetACKNoDelay changes ack flush option, set true to flush ack immediately,
func (*UDPSession) SetDSCP ¶
func (s *UDPSession) SetDSCP(dscp int) error
SetDSCP sets the 6bit DSCP field in IPv4 header, or 8bit Traffic Class in IPv6 header.
if the underlying connection has implemented `func SetDSCP(int) error`, SetDSCP() will invoke this function instead.
It has no effect if it's accepted from Listener.
func (*UDPSession) SetDUP ¶
func (s *UDPSession) SetDUP(dup int)
(deprecated)
SetDUP duplicates udp packets for kcp output.
func (*UDPSession) SetDeadline ¶
func (s *UDPSession) SetDeadline(t time.Time) error
SetDeadline sets the deadline associated with the listener. A zero time value disables the deadline.
func (*UDPSession) SetIdleTicker ¶ added in v1.0.5
func (s *UDPSession) SetIdleTicker(t time.Duration)
设置最大空闲时间
func (*UDPSession) SetMtu ¶
func (s *UDPSession) SetMtu(mtu int) bool
SetMtu sets the maximum transmission unit(not including UDP header)
func (*UDPSession) SetNoDelay ¶
func (s *UDPSession) SetNoDelay(nodelay, interval, resend, nc int)
SetNoDelay calls nodelay() of kcp https://github.com/skywind3000/kcp/blob/master/README.en.md#protocol-configuration
func (*UDPSession) SetReadBuffer ¶
func (s *UDPSession) SetReadBuffer(bytes int) error
SetReadBuffer sets the socket read buffer, no effect if it's accepted from Listener
func (*UDPSession) SetReadDeadline ¶
func (s *UDPSession) SetReadDeadline(t time.Time) error
SetReadDeadline implements the Conn SetReadDeadline method.
func (*UDPSession) SetStreamMode ¶
func (s *UDPSession) SetStreamMode(enable bool)
SetStreamMode toggles the stream mode on/off
func (*UDPSession) SetWindowSize ¶
func (s *UDPSession) SetWindowSize(sndwnd, rcvwnd int)
SetWindowSize set maximum window size
func (*UDPSession) SetWriteBuffer ¶
func (s *UDPSession) SetWriteBuffer(bytes int) error
SetWriteBuffer sets the socket write buffer, no effect if it's accepted from Listener
func (*UDPSession) SetWriteDeadline ¶
func (s *UDPSession) SetWriteDeadline(t time.Time) error
SetWriteDeadline implements the Conn SetWriteDeadline method.
func (*UDPSession) SetWriteDelay ¶
func (s *UDPSession) SetWriteDelay(delay bool)
SetWriteDelay delays write for bulk transfer until the next update interval
func (*UDPSession) Write ¶
func (s *UDPSession) Write(b []byte) (n int, err error)
Write implements Net.Conn
func (*UDPSession) WriteBuffers ¶
func (s *UDPSession) WriteBuffers(v [][]byte) (n int, err error)
WriteBuffers write a vector of byte slices to the underlying connection