feat:KCP协议

This commit is contained in:
nnbcccscdscdsc
2026-03-24 21:09:06 +08:00
parent 290ba18962
commit be013b701b
20 changed files with 2284 additions and 16 deletions

View File

@@ -0,0 +1,91 @@
package transport
import (
"encoding/binary"
"net"
"sync"
"time"
)
func newKCPPacketConn(conn *net.UDPConn, logger KCPPacketDebugLogger, nodeRole, nodeID string) (net.PacketConn, error) {
return newPlatformKCPPacketConn(conn, logger, nodeRole, nodeID)
}
type kcpPacketConnBase struct {
conn *net.UDPConn
logger KCPPacketDebugLogger
nodeRole string
nodeID string
closeOnce sync.Once
closeErr error
closed chan struct{}
}
func (c *kcpPacketConnBase) LocalAddr() net.Addr {
return c.conn.LocalAddr()
}
func (c *kcpPacketConnBase) Close() error {
c.closeOnce.Do(func() {
close(c.closed)
c.closeErr = c.conn.Close()
})
return c.closeErr
}
func (c *kcpPacketConnBase) SetDeadline(t time.Time) error {
return c.conn.SetDeadline(t)
}
func (c *kcpPacketConnBase) SetReadDeadline(t time.Time) error {
return c.conn.SetReadDeadline(t)
}
func (c *kcpPacketConnBase) SetWriteDeadline(t time.Time) error {
return c.conn.SetWriteDeadline(t)
}
func (c *kcpPacketConnBase) SetReadBuffer(bytes int) error {
return c.conn.SetReadBuffer(bytes)
}
func (c *kcpPacketConnBase) SetWriteBuffer(bytes int) error {
return c.conn.SetWriteBuffer(bytes)
}
func (c *kcpPacketConnBase) logKCPPacketDebugRecord(record KCPPacketDebugRecord) {
if c.logger == nil {
return
}
_ = c.logger.LogKCPPacketDebugRecord(record)
}
func (c *kcpPacketConnBase) newKCPPacketDebugRecord(event string, remoteAddr net.Addr, packetBytes int, tsUnixNano int64, udpTxID *uint32, kcpConv *uint32) KCPPacketDebugRecord {
record := KCPPacketDebugRecord{
Event: event,
NodeRole: c.nodeRole,
NodeID: c.nodeID,
LocalAddr: "",
RemoteAddr: "",
PacketBytes: packetBytes,
UDPTXID: udpTxID,
KCPConv: kcpConv,
TSUnixNano: tsUnixNano,
}
if localAddr := c.conn.LocalAddr(); localAddr != nil {
record.LocalAddr = localAddr.String()
}
if remoteAddr != nil {
record.RemoteAddr = remoteAddr.String()
}
return record
}
func parseKCPConversationID(packet []byte) *uint32 {
if len(packet) < 4 {
return nil
}
conv := binary.LittleEndian.Uint32(packet[:4])
return &conv
}