feat:KCP协议
This commit is contained in:
91
cmd/internal/transport/kcp_packet_conn.go
Normal file
91
cmd/internal/transport/kcp_packet_conn.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user