package transport import ( "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, segments []KCPPacketDebugSegment) KCPPacketDebugRecord { record := KCPPacketDebugRecord{ Event: event, NodeRole: c.nodeRole, NodeID: c.nodeID, LocalAddr: "", RemoteAddr: "", PacketBytes: packetBytes, UDPTXID: udpTxID, KCPConv: kcpConv, Segments: append([]KCPPacketDebugSegment(nil), segments...), TSUnixNano: tsUnixNano, } if localAddr := c.conn.LocalAddr(); localAddr != nil { record.LocalAddr = localAddr.String() } if remoteAddr != nil { record.RemoteAddr = remoteAddr.String() } return record }