92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
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
|
|
}
|